Git完全删除未合并的根节点

Git完全删除未合并的根节点,git,Git,我们有两个回购协议,Repo1和Repo2。看起来“某人”将Repo2推到Repo1/origin,现在Repo1包含Repo1和Repo2。有两个独立的根节点,没有合并(幸运的是)。Repo1也被来自Repo2的一大堆标签/分支所污染 如何使用特定的祖先(Repo2的根节点也称为“初始提交”)完全禁止任何提交(及其标记/分支)?或者是一种不同/更简单的方式来拼接这两种回购协议 请注意,两个repo都包含数年的工作时间(因此手动查看每个提交是不实际的),但是如果需要,使用Repo1重新克隆的每个

我们有两个回购协议,Repo1和Repo2。看起来“某人”将Repo2推到Repo1/origin,现在Repo1包含Repo1和Repo2。有两个独立的根节点,没有合并(幸运的是)。Repo1也被来自Repo2的一大堆标签/分支所污染

如何使用特定的祖先(Repo2的根节点也称为“初始提交”)完全禁止任何提交(及其标记/分支)?或者是一种不同/更简单的方式来拼接这两种回购协议


请注意,两个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 %