git浅克隆 - 如何删除"嫁接标签"它是什么?

时间:2018-04-09 11:13:05

标签: git git-clone

所以我们创建了一个模板项目" template_proj.git"。

更新 git版本是:Windows 7教程中的2.14.1

我们有新项目是空的,除非他们有一个提交,其中包含.gitignore文件。让我们说其中一个项目名为" projectA.git"。

所以我的方法是:

  1. 将template_proj.git克隆到名为" Project_A"的文件夹中。为此,我使用:clone template_prog.git --depth=1 --recursive
  2. 删除遥控器:git remote rm origin
  3. 添加新远程:git remote add origin projectA.git
  4. 强制合并项目:git pull origin master --allow-unrelated-histories
  5. 这很有效。 注意:我不能从模板克隆中删除我的.git文件夹的主要原因是它有子模块。

    这给了我一个包含3次提交的回购(这正是我想要的):

    • template_proj.git的提示
    • projectA.git的提示(并且只提交)
    • 包含两者新合并的提交。

    然而,有特殊标签/分支"嫁接"与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文件。

2 个答案:

答案 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

在这里,我们仍然有两个分支名称masterdevelop,它们仍然指向两个不同的提交。他们的每个提交都指向第二个(早期)提交。这两个中的每一个都指向(共享)第三方提交,但是我们已经达到了我们的深度限制,因此每个都有一个标记 - 一个X越过链接返回到先前的提交。 / p>

您运行git log时所看到的标记或任何显示提交的内容。 Git需要知道它不应该试图寻找更多的提交 - 它所做的提交已经说过&#34;我以前的提交是......&#34;但之前的提交缺少。如果没有标记,Git会告诉您存储库已损坏。

如果我们将--depth设置为3,则标记会更进一步:

        o--o   <-- master
       /
    X-o
       \
        o--o   <-- develop

但如果--depth设置为1,那么标记就在每个提示提交时,您将始终看到它。