所以我们创建了一个模板项目" template_proj.git"。
更新 git版本是:Windows 7教程中的2.14.1
我们有新项目是空的,除非他们有一个提交,其中包含.gitignore文件。让我们说其中一个项目名为" projectA.git"。
所以我的方法是:
clone template_prog.git --depth=1 --recursive
git remote rm origin
git remote add origin projectA.git
git pull origin master --allow-unrelated-histories
这很有效。 注意:我不能从模板克隆中删除我的.git文件夹的主要原因是它有子模块。
这给了我一个包含3次提交的回购(这正是我想要的):
然而,有特殊标签/分支"嫁接"与the tip of template_proj.git
提交相关联。我真的不想要那个。
所以我的问题:
grafted
代码?grafted
代码?我无法完全理解grafted
究竟是什么/意味着什么 - 我搜索过它并发现了一些信息,但仍然不太确定。作为git搜索中的关键字,它被更常见的项目(或者我的google-fu很弱)过度统治:(
更新:此问题也不能完全回答:What exactly is a "grafted" commit in a shallow clone? - 因为它并没有真正说出为什么嫁接存在或者做什么(如果有的话)。另外,我的回购邮件中没有.git/info/grafts
文件。
答案 0 :(得分:2)
环顾四周后,我终于找到了我需要的东西 - 我在追查了一长串问题后得到了它 - >回答 - >链接到问题 - >回答 - > 12日注释。无论如何,这里有一些选择:
git fetch --unshallow
- 这会破坏你的克隆并基本上恢复完整的历史记录。不是我想要的,但我可以用它来撤消--depth=1
克隆。git filter-branch -f -- --all
- 这似乎削减了嫁接位。 注意:如果没有-f
选项,它可以很好地完成工作,但它会让旧的提交继续下去,所以一旦从嫁接开始,你就会得到2棵树(缺少更好的词)点和另一个全新的。但这对于一个随意的旁观者来说是混乱的 - 所以使用force选项来修剪所有这些。我的信息来源:how-do-i-remove-the-old-history-from-a-git-repository - 第9条评论突出显示-f
选项(您必须展开评论)。
所以这与git嫁接有关。我没有得到.git / info / grafts文件,但我确实手动创建了一个echo <SOME-COMMIT-SHA> > .git/info/grafts
。当我这样做时,我在我选择的commit-sha上得到了第二个grafted
标签。所以我想你可以用它来选择一个关于历史的点和git filter-branch...
。
真的需要阅读更多关于嫁接的信息,但它不是我现在感兴趣的一个特征 - 除此之外,在这种情况下摆脱它:o
<强>更新强>
我必须跑:
git filter-branch -- --all
然后
git filter-branch -f -- --all
作为一个两步过程...不太确定如何/为什么。第一个拆分它们,第二个删除不可达的提交或什么?
从Toreks评论更新
现在我执行以下操作:
git clone <url> --recursive --depth=1
cd into folder
git remote rm origin
git remote add origin <new url>
git filter-branch -- --all
rm -rf .git/refs/original/*
现在我可以正常运行以获得空的proj / merge,然后推动我的更改:
git pull origin master
commit anything here if needed...
git push origin master
答案 1 :(得分:2)
它不是标记,如果不使存储库非浅(e.g., git fetch --unshallow
),则无法将其删除。它是标记,表示这是历史记录中断的点。
但是,您可以通过深化历史记录来移动标记。由于标记存在于每次提交时,历史记录被切断,如果历史记录在您关注的点之下切断,则您将看不到标记。例如,使用深度为2会将标记置于您获得的提交之下。
请注意,计算机科学家喜欢将树木颠倒过来:而不是顶部的树叶,树枝朝向地面,然后树干伸入地面,计算机科学理论的人们从树干开始:
|
然后在它下面添加分支:
|
/ \
并将叶子放在底部。
对于StackOverflow,我喜欢用左的根/主干和右边的叶子绘制我的树:
o--o
/
o--o--o
\
o--o
这里有一个带有两个分支的简单树。让我们标记分支:
o--o <-- master
/
o--o--o
\
o--o <-- develop
恭喜,您现在了解Git的分支机构! 咳嗽好的,也许还没有。 :-)还有更多内容,包括提交形成图形而不是简单的树,但这就是我们现在所需要的:我们需要说什么一个浅层克隆是。让我们绘制一个深度为2的浅层克隆,由同一个存储库构成:
o--o <-- master
X
X
o--o <-- develop
在这里,我们仍然有两个分支名称master
和develop
,它们仍然指向两个不同的提交。他们的每个提交都指向第二个(早期)提交。这两个中的每一个都指向(共享)第三方提交,但是我们已经达到了我们的深度限制,因此每个都有一个标记 - 一个X
越过链接返回到先前的提交。 / p>
您运行git log
时所看到的标记或任何显示提交的内容。 Git需要知道它不应该试图寻找更多的提交 - 它所做的提交已经说过&#34;我以前的提交是......&#34;但之前的提交缺少。如果没有标记,Git会告诉您存储库已损坏。
如果我们将--depth
设置为3,则标记会更进一步:
o--o <-- master
/
X-o
\
o--o <-- develop
但如果--depth
设置为1,那么标记就在每个提示提交时,您将始终看到它。