因此,我们创建了一个模板项目"template_proj.git“。
更新 git版本为: 2.14.1在Windows7上
我们有一些空的新项目,除了其中有一个带有.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
文件。
发布于 2018-04-09 16:36:56
它不是标记,如果不使存储库非浅(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
删除了可以追溯到早期提交的链接。
在运行git log
或任何显示提交的标记时,都会看到这个标记。Git需要知道,它不应该试图寻找更多的提交--它确实有这样的提交:“我以前的提交是.”但之前的提交缺失了。如果没有标记,Git会告诉您存储库已经损坏。
如果我们将--depth
设置为3,则标记将返回更远的位置:
o--o <-- master
/
X-o
\
o--o <-- develop
但是,如果--depth
设置为1,则标记在每个提示提交时都是正确的,您将始终看到它。
发布于 2018-04-09 16:27:47
在环顾四周后,我终于找到了我需要的东西--我遵循了一连串的问题-->答案-->链接--问题-->答案-->第12条评论。总之,这里有一些选择:
git fetch --unshallow
-这个非浅滩你的克隆人,基本上得到了完整的历史。不是我想要的,但我可以用它来撤销--depth=1
克隆。git filter-branch -f -- --all
-这似乎是修剪嫁接的比特。注意:没有-f
选项的可以很好地完成工作,但是它留下了旧的提交,因此您最终得到了2棵树(因为缺少更好的单词),一次是从嫁接点开始的,另一次是全新的树。但是这对一个随意的旁观者来说是很混乱的--所以,使用强制选项把所有这些都剪掉。我的信息来源:how-do-i-remove-the-old-history-from-a-git-repository -第9号评论突出显示了-f
选项(您必须展开注释)。
所以这和嫁接有关。我没有得到一个. get /info/graft文件,但我确实手动创建了一个echo <SOME-COMMIT-SHA> > .git/info/grafts
。当我这样做时,我在所选的commit-sha上得到了第二个grafted
标签。因此,我想您可以使用它来选择一个点,将历史与git filter-branch...
一起分割开来。
真的需要阅读更多关于嫁接的内容,但这并不是我现在感兴趣的特性
更新:
我不得不跑:
git filter-branch -- --all
然后
git filter-branch -f -- --all
作为一个两步的过程。不太清楚怎么/为什么。第一个拆分它们,第二个删除不可访问的提交或其他什么?
来自托雷斯注释的更新
现在我做以下工作:
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
https://stackoverflow.com/questions/49731594
复制相似问题