Git完全删除未合并的根节点
我们有两个回购协议,Repo1和Repo2。看起来“某人”将Repo2推到Repo1/origin,现在Repo1包含Repo1和Repo2。有两个独立的根节点,没有合并(幸运的是)。Repo1也被来自Repo2的一大堆标签/分支所污染 如何使用特定的祖先(Repo2的根节点也称为“初始提交”)完全禁止任何提交(及其标记/分支)?或者是一种不同/更简单的方式来拼接这两种回购协议Git完全删除未合并的根节点,git,Git,我们有两个回购协议,Repo1和Repo2。看起来“某人”将Repo2推到Repo1/origin,现在Repo1包含Repo1和Repo2。有两个独立的根节点,没有合并(幸运的是)。Repo1也被来自Repo2的一大堆标签/分支所污染 如何使用特定的祖先(Repo2的根节点也称为“初始提交”)完全禁止任何提交(及其标记/分支)?或者是一种不同/更简单的方式来拼接这两种回购协议 请注意,两个repo都包含数年的工作时间(因此手动查看每个提交是不实际的),但是如果需要,使用Repo1重新克隆的每个
请注意,两个repo都包含数年的工作时间(因此手动查看每个提交是不实际的),但是如果需要,使用Repo1重新克隆的每个人都是可行的。从您的文字描述中,我想您的意思是,您有一个包含两个独立(从技术上讲是不相交的)的存储库其中提交的子图。例如,这里是这样一个存储库的示意图:
C--D
/ \
A--B G--H <-- branch1
\ /
E--F <-- branch2
I--J--K--L <-- master
\
M--N <-- develop
确保包含指向故意放弃的子图的任何标记或其他名称。正常的图形查看命令,如git log
,将不会显示未引用的子图形:它将显示为已删除,尽管它仍将实际存在。最终,未引用的子图将消失,或者您可以使用git-gc
更快地删除它。从该存储库生成的克隆不会有未引用的子图
在两个克隆中的另一个克隆中,删除对另一个子图的所有引用:
C--D
/ \
A--B G--H [abandoned]
\ /
E--F [abandoned]
I--J--K--L <-- master
\
M--N <-- develop
这种预接收挂钩将拒绝这种推送。这可能是你想要的,但可能不是;请注意您的编程目的。:-) 向TLDR人群发布这篇文章,这一切都归功于托瑞克出色的回答 我运行了这个(在windows MINGW64 git cli上,引用/转义可能在其他终端上有所不同),检查了它,然后运行了它输出的所有命令
git for-each-ref --contains <root_commit_hash> --format="%(refname:short)" refs/tags | xargs -I % echo git tag -d % \&\& git push --delete origin %
git for each ref--contains--format=“%(refname:short)”refs/tags | xargs-I%echo git tag-d%\&\&git push--delete origin%
添加一些
git-gc
和/或git-prune
以获得更好的度量。使用了什么合并策略?这两个分支是通过什么命令合并/推送的?没有合并。我认为只是一个正常的“git push origin”(git push origin)设置了错误的原点,但这只是一个猜测,因为这是两种以多个根节点结束的方法之一,它肯定不是一个新的孤立分支。谢谢,这是完全正确的,但我有点希望是一个可以做到这一点的单行程序:在一个这样的克隆中,如果两个子图之一中的任何提交存在任何其他引用,请删除任何外部标签分支名称、标记名称和其他引用:“。有很多分支/标签,必须逐个检查所有这些分支/标签是相当痛苦的。基本上,任何可以从特定提交中获取所有标记/分支/引用(即使是三个命令)“可访问”的命令都有助于确定要删除的内容,然后可能会将该输出管道化到删除中。git for each ref
可以做到这一点(只要您的git足够新):git for each ref--contains refs/
获取一组,而--no contains
获取另一组。
before:
A--B--C <-- master
after:
A--B--C--F--G <-- master
/
D--E
git for-each-ref --contains <root_commit_hash> --format="%(refname:short)" refs/tags | xargs -I % echo git tag -d % \&\& git push --delete origin %