git shallow clone - 我如何删除 "grafted tag"它是什么?

标签 git git-clone

因此我们创建了一个模板项目“template_proj.git”。

更新 git 版本是:Windows 7 prof 上的 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. 强制 merge 项目:git pull origin master --allow-unrelated-histories

这很好用。 注意:我不从模板克隆中删除我的 .git 文件夹的主要原因是它有子模块。

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

  • template_proj.git 的提示
  • projectA.git 的提示(也是唯一的提交)
  • 包含两者新 merge 的提交。

然而,有一个特殊的标签/分支“嫁接”与 template_proj.git 的提示 提交相关联。我真的不想那样。

所以我的问题:

  • 这是执行此操作的有效方法吗(即是否有更好的方法)?
  • 如何去掉 grafted 标签?
  • 什么是嫁接标签?

我无法完全理解 grafted 的真正含义/含义 - 我确实搜索过它并找到了一些信息,但仍然不太确定。作为 git 搜索中的关键字,它被更常见的项目所取代(或者我的 google-fu 很弱):(

更新:这里的这个问题也没有完全回答:What exactly is a "grafted" commit in a shallow clone? - 因为它并没有真正说明为什么存在嫁接或如何处理它(如果有的话)。我的仓库中也没有:.git/info/grafts 文件。

最佳答案

它不是标签,如果不使存储库非浅层化(例如,git fetch --unshallow),则无法删除它。 标记 表示这是历史记录的中断点。

但是,您可以通过加深历史来移动标记。由于标记存在于历史被截断的每次提交中,如果历史在您关心的点以下被截断,您将看不到该标记。例如,使用深度 2 会将标记放在您获得的提交下方。

背景说明

请注意,计算机科学家喜欢把他们的树倒过来画:不是树叶在顶部, Twig 伸向地面,然后树干伸入地面,计算机科学理论家从树干开始:

    |

然后在它下面添加分支:

    |
   / \

然后把叶子放在底部。

为了 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 划掉了返回到之前的链接提交。

当您运行 git log 或任何显示提交的内容时,您就会看到这个标记。 Git 需要知道它不应该尝试寻找更多的提交——它确实的提交说“我之前的提交是……”但是之前的提交丢失 .如果没有标记,Git 会告诉您存储库已损坏。

如果我们将 --depth 设置为 3,则标记会更靠后:

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

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

关于git shallow clone - 我如何删除 "grafted tag"它是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49731594/

相关文章:

command-line-interface - faSTLane - 克隆证书存储库时出错

git - 如何解释git日志中的括号?

git - 从 svn 存储库克隆 git 存储库,导致无文件、无远程分支的 git 存储库

git - 如何在不获取整个 repo 协议(protocol)的情况下仅克隆特定标签?

git - 如何在 git 日志中获取 TFS checkin ID?

Git clone from remote ssh repository - 在执行克隆命令之前更改远程网络上的机器

git - 克隆存储库时导入别名

git - 切换到分支时如何保持忽略的文件而不忽略它们?

git - 如何在 Windows 上使用 git 推送到 github?

linux - 使用 Jenkins 在 git 中处理文件权限的最佳实践