git 浅克隆 - 如何删除 "grafted tag" 它是什么?
git shallow clone - how do I remove the "grafted tag" and what is it?
所以我们创建了一个模板项目"template_proj.git"。
更新 git 版本是:Windows 7 prof
上的 2.14.1
我们有一些新项目是空的,除了它们有一个带有 .gitignore 文件的提交。假设其中一个项目称为 "projectA.git".
所以我的方法是:
- 克隆 template_proj.git 到名为 "Project_A" 的文件夹中。为此,我使用:
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 个提交的回购协议(这正是我想要的):
- template_proj.git的小费
- projectA.git
的提示(且仅提交)
- 包含两者新合并的提交。
但是有一个特殊的 tag/branch "grafted" 与 the tip of template_proj.git
提交相关联。我真的不想那样。
所以我的问题:
- 这是执行此操作的有效方法吗(即是否有更好的方法)?
- 如何删除
grafted
标签?
- 什么是
grafted
标签?
我没能完全理解 grafted
到底是什么 is/means - 我确实搜索过它并找到了一些信息,但仍然不太确定。作为 git 搜索中的关键字,它被更常见的项目所取代(或者我的 google-fu 很弱):(
更新: 这里的这个问题也没有完全回答:What exactly is a "grafted" commit in a shallow clone? - 因为它并没有真正说明为什么嫁接在那里或如何处理它(如果任何事物)。我的回购中也没有:.git/info/grafts
文件。
环顾四周后,我终于找到了我需要的东西 - 在经过一长串问题 --> 答案 --> link-to-question --> 答案 --> 第 12 条评论后,我找到了它。不管怎样,这里有一些选择:
git fetch --unshallow
- 这个 un-shallows 你的克隆,基本上可以恢复完整的历史记录。不是我想要的,但我可以用它来撤消 --depth=1
克隆。
git filter-branch -f -- --all
- 这似乎是trim掉的嫁接位。 注意: 如果没有 -f
选项,它可以很好地完成工作,但它会让旧的提交继续运行,所以一旦开始,你最终会得到 2 棵树(因为缺少更好的词)从嫁接点和另一个全新的点。但这对于一个不经意的旁观者来说是混乱的 - 所以使用 force 选项 trim 全部消失。
我的信息来源: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
作为一个两步过程...不太确定 how/why。第一个拆分它们,第二个删除无法访问的提交或其他东西?
来自 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然后把我的改动push上去:
git pull origin master
commit anything here if needed...
git push origin master
它不是标签,如果不创建存储库 non-shallow (e.g., git fetch --unshallow
),您将无法删除它。 标记表示这是历史记录的截止点。
但是,您可以通过加深历史记录来移动 标记。由于标记存在于历史被截断的每次提交中,如果历史在您关心的点以下被截断,您将看不到该标记。例如,使用深度 2 会将标记置于您获得的提交下方。
背景说明
请注意,计算机科学家喜欢将他们的树倒过来画:而不是树叶在顶部,树枝朝向地面,然后 运行k 伸入地面,计算机科学理论的人从t运行k:
|
然后在下面添加分支:
|
/ \
然后把叶子放在底部。
出于 Whosebug 的目的,我喜欢用根 / t运行k 在 左边 和叶子在 右边来绘制我的树:
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
,它们仍然指向两个不同的提交。他们的每个提交都指向 second(较早的)提交。这两个中的每一个都指向(共享)third-back 提交,但是我们已经达到了深度限制,所以每个都有一个标记——一个 X
划掉了返回到早期提交的链接.
当你 运行 git log
或任何显示提交的东西时,你会看到这个 标记 。 Git 需要知道它不应该尝试寻找更多的提交——它 确实 的提交说 "my previous commit is ..." 但之前的提交是 失踪。如果没有标记,Git 会告诉您存储库已损坏。
如果我们将 --depth
设置为 3,则标记会更靠后:
o--o <-- master
/
X-o
\
o--o <-- develop
但如果 --depth
设置为 1,标记 就在 每次提示提交时,您将始终看到它。
所以我们创建了一个模板项目"template_proj.git"。
更新 git 版本是:Windows 7 prof
上的 2.14.1我们有一些新项目是空的,除了它们有一个带有 .gitignore 文件的提交。假设其中一个项目称为 "projectA.git".
所以我的方法是:
- 克隆 template_proj.git 到名为 "Project_A" 的文件夹中。为此,我使用:
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 个提交的回购协议(这正是我想要的):
- template_proj.git的小费
- projectA.git 的提示(且仅提交)
- 包含两者新合并的提交。
但是有一个特殊的 tag/branch "grafted" 与 the tip of template_proj.git
提交相关联。我真的不想那样。
所以我的问题:
- 这是执行此操作的有效方法吗(即是否有更好的方法)?
- 如何删除
grafted
标签? - 什么是
grafted
标签?
我没能完全理解 grafted
到底是什么 is/means - 我确实搜索过它并找到了一些信息,但仍然不太确定。作为 git 搜索中的关键字,它被更常见的项目所取代(或者我的 google-fu 很弱):(
更新: 这里的这个问题也没有完全回答:What exactly is a "grafted" commit in a shallow clone? - 因为它并没有真正说明为什么嫁接在那里或如何处理它(如果任何事物)。我的回购中也没有:.git/info/grafts
文件。
环顾四周后,我终于找到了我需要的东西 - 在经过一长串问题 --> 答案 --> link-to-question --> 答案 --> 第 12 条评论后,我找到了它。不管怎样,这里有一些选择:
git fetch --unshallow
- 这个 un-shallows 你的克隆,基本上可以恢复完整的历史记录。不是我想要的,但我可以用它来撤消--depth=1
克隆。git filter-branch -f -- --all
- 这似乎是trim掉的嫁接位。 注意: 如果没有-f
选项,它可以很好地完成工作,但它会让旧的提交继续运行,所以一旦开始,你最终会得到 2 棵树(因为缺少更好的词)从嫁接点和另一个全新的点。但这对于一个不经意的旁观者来说是混乱的 - 所以使用 force 选项 trim 全部消失。
我的信息来源: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
作为一个两步过程...不太确定 how/why。第一个拆分它们,第二个删除无法访问的提交或其他东西?
来自 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然后把我的改动push上去:
git pull origin master
commit anything here if needed...
git push origin master
它不是标签,如果不创建存储库 non-shallow (e.g., git fetch --unshallow
),您将无法删除它。 标记表示这是历史记录的截止点。
但是,您可以通过加深历史记录来移动 标记。由于标记存在于历史被截断的每次提交中,如果历史在您关心的点以下被截断,您将看不到该标记。例如,使用深度 2 会将标记置于您获得的提交下方。
背景说明
请注意,计算机科学家喜欢将他们的树倒过来画:而不是树叶在顶部,树枝朝向地面,然后 运行k 伸入地面,计算机科学理论的人从t运行k:
|
然后在下面添加分支:
|
/ \
然后把叶子放在底部。
出于 Whosebug 的目的,我喜欢用根 / t运行k 在 左边 和叶子在 右边来绘制我的树:
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
,它们仍然指向两个不同的提交。他们的每个提交都指向 second(较早的)提交。这两个中的每一个都指向(共享)third-back 提交,但是我们已经达到了深度限制,所以每个都有一个标记——一个 X
划掉了返回到早期提交的链接.
当你 运行 git log
或任何显示提交的东西时,你会看到这个 标记 。 Git 需要知道它不应该尝试寻找更多的提交——它 确实 的提交说 "my previous commit is ..." 但之前的提交是 失踪。如果没有标记,Git 会告诉您存储库已损坏。
如果我们将 --depth
设置为 3,则标记会更靠后:
o--o <-- master
/
X-o
\
o--o <-- develop
但如果 --depth
设置为 1,标记 就在 每次提示提交时,您将始终看到它。