首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >git浅表克隆-我如何删除“嫁接标签”,它是什么?

git浅表克隆-我如何删除“嫁接标签”,它是什么?
EN

Stack Overflow用户
提问于 2018-04-09 11:13:04
回答 2查看 6K关注 0票数 9

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

更新 git版本为: 2.14.1在Windows7上

我们有一些空的新项目,除了其中有一个带有.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

这个效果很好。注意:我不只是删除模板克隆中的.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文件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-09 16:36:56

它不是标记,如果不使存储库非浅(e.g., git fetch --unshallow),就不能删除它。它是一个标志,表明这是历史的断点。

然而,通过加深历史,你可以移动标记。由于标记存在于历史记录被切断的每次提交中,如果历史记录在您所关心的点以下被切断,您将不会看到标记。例如,使用2的深度会将标记置于所得到的提交下面。

背景解释

请注意,计算机科学家喜欢把他们的树倒着画:计算机科学理论中的人们从树干开始,而不是顶部的叶子,树枝朝向地面,然后树干粘在地上:

代码语言:javascript
运行
复制
    |

然后在它下面添加分支:

代码语言:javascript
运行
复制
    |
   / \

把叶子放在底部。

为了StackOverflow的目的,我喜欢用树根/树干在左边画树,在右边画叶子:

代码语言:javascript
运行
复制
        o--o
       /
o--o--o
       \
        o--o

这里有一棵有两根树枝的简单树。让我们给枝条贴上标签:

代码语言:javascript
运行
复制
        o--o   <-- master
       /
o--o--o
       \
        o--o   <-- develop

恭喜你,你现在明白Git的分支了!咳嗽好吧,也许还不太好。-)它还有很多,包括从图而不是简单树中提交,但这是我们现在所需要的:我们需要说的是浅层克隆。让我们从同一个存储库中绘制深度2的浅克隆:

代码语言:javascript
运行
复制
        o--o   <-- master
       X

       X
        o--o   <-- develop

在这里,我们仍然有相同的两个分支名称,masterdevelop,它们仍然指向两个不同的提交。它们的每个提交都指向第二次(更早)提交。这两个都会指向(共享的)第三次回提交,但是我们已经达到了深度限制,因此每个都有一个标记--一个X删除了可以追溯到早期提交的链接。

在运行git log或任何显示提交的标记时,都会看到这个标记。Git需要知道,它不应该试图寻找更多的提交--它确实有这样的提交:“我以前的提交是.”但之前的提交缺失了。如果没有标记,Git会告诉您存储库已经损坏。

如果我们将--depth设置为3,则标记将返回更远的位置:

代码语言:javascript
运行
复制
        o--o   <-- master
       /
    X-o
       \
        o--o   <-- develop

但是,如果--depth设置为1,则标记在每个提示提交时都是正确的,您将始终看到它。

票数 24
EN

Stack Overflow用户

发布于 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

作为一个两步的过程。不太清楚怎么/为什么。第一个拆分它们,第二个删除不可访问的提交或其他什么?

来自托雷斯注释的更新

现在我做以下工作:

代码语言:javascript
运行
复制
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,然后将更改推高:

代码语言:javascript
运行
复制
git pull origin master
commit anything here if needed...
git push origin master
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49731594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档