如何在没有整个历史的情况下克隆种子/启动项目?


76

请注意,使用--depth=1parameter可以防止将项目推送到新的存储库


是的,--depth=N而不是1呢?“浅层更新”仍然被拒绝,只是这样做rm -r .gitgit init不会削减它。我将尝试整个“非嫁接”魔术,并且如果它适用于一般情况(深度N),则应为已接受(也是最受推崇的;))答案。
Tomasz Gandor

Answers:


66

你可以做一个

git clone <git_url>

从文件夹中删除.git存储库。这将删除您的所有历史记录。

你可以做一个

git init 

这将为您创建一个全新的git项目。

这可能不是最好的方法。但这会起作用。希望能帮助到你。


9
它很可能会删除所有子模块。
Aleksander Alekseev

@AleksanderAlekseev您在说什么子模块?
威拉

如果您不需要历史记录,这是最简单的解决方法。
Willa

2
如果采取这种方法,@ Willa是否仍可以将上游项目中的更新合并到我的项目中?
费利佩

1
我不确定我是否理解您的问题@FelipeAlmeida。无论如何,这种处理方式就像您已经使用现有源创建了一个全新的git项目。如果遵循这种方式,那么对新项目可以做的任何事情都应该是可能的。
威拉

31

只要您认为完全没有历史记录就没问题,Ajay建议的方法就完全正确。但是,如果您想保留浅表克隆的历史记录,我有不同的建议。


浅表克隆通过使用所谓的嫁接点伪造“第一次”提交的父级来假装具有完整的历史记录。如果假设我们拥有完整的历史记录,则可以改写以下问题:在特定的修订版本之前,如何丢弃历史记录?

这意味着我们可以结合使用嫁接点和git filter-branch(如链接的问题中所建议)。但是,您必须注意,这将重写您的完整历史记录,从而使新记录与我们最初从中克隆的远程记录不兼容。因此,我们应该从存储库中删除旧的远程服务器。

git remote remove <old-remote-name>

现在我们可以开始重写了。假设我们要使当前的master提交存储库的新根目录。

git rev-parse --verify master >> .git/info/grafts
git filter-branch -- --all

这将重写存储库的完整历史记录,并将当前的主提交作为新的根目录。您可以通过删除中的“备份”引用来完成重写refs/original。此外,您现在可以删除.git/shallow文件。

完成此操作后,您应该可以将当前未移植的历史记录推送到新的遥控器中。


2
Git版本> 1.9.0允许从浅表克隆中推送。如果要将完整的历史记录保留在服务器上,而只需要去年的历史记录,则非常方便。唯一的是,我认为您需要在客户端和服务器上均具有git> 1.9.0,才能利用此功能。
jtorca 2015年

相反git rev-parse --verify master >> .git/info/grafts,我首先签出了新的嫁接点,然后使用了提交引用:git rev-parse --verify 9133eece0 >> .git/info/grafts。然后我做了git filter-branch -- --all。我不需要删除.git/shallow文件,因为它已经消失了。我不太了解如何删除“中的“备份”引用refs/original,我猜这就是为什么嫁接的仓库仍然是68M的原因。但是,在推送到新的上游仓库之后,我又在本地重新克隆了,结果是一个112,000克隆,这正是我所期望的
JinnKo 2015年

1
@JinnKo我删除“备份”引用的意思是从字面上执行一个rm -rf .git/refs/original。;)
Sascha Wolf 2015年

2
引用可以以各种形式存在。删除引用的安全方法是例如git update-ref -d refs/original/master(实际上我通常是git push . :refs/blah因为我曾经不知道update-ref)。有关更详尽的解释,请参见“如何删除旧历史记录”的答案。
clacke 2015年

1

尝试这样的事情:

mkdir -p /tmp/git-copy
cd /tmp/git-copy

# create another copy of your repository
git clone file:///path/to/cloned/repo

cd repo
git rebase -i (first-commit)

# in vim:
# :2,$s/^pick/squash
# :w

# Now wait, it will take a while...

git push --mirror git@github.com:username/new-repo.git

我刚才在此存储库中尝试过。似乎可以正常工作-没有历史记录,所有子模块均完好无损。


1
只是重新调整对我没有用,因为使用depth参数总是会使克隆变浅,而这正是OP所要的,我的用例也是如此。filter-branch正如Zeeker所说,正确的答案是必需的。
赫苏斯·弗朗哥

`:2,$ s / ^ pick / squash`这是vim命令,还是我们应该在顶部添加的文本?你能解释一下这是什么吗?
阿诺德·罗阿

@ArnoldRoa这是一个VIM命令,将从VIM文件中的所有“ pick”替换为“ squash”(从第二行开始)。
user2528260
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.