如何在远程仓库中找到已删除的分支

时间:2020-08-25 09:23:04

标签: git

我正在寻找一个可以从git bash运行的命令,以查找从远程删除的分支。以下命令对一个存储库有效,而对其他存储库无效。

git branch -v|grep \\[gone\\]|awk '{print $1}'

即使从位存储桶远程存储库URL中删除了已删除的分支,我也看不到它。上面的命令对一个仓库有效,但对其他仓库无效。 我不想删除分支,只需要知道从远程存储库中删除了所有分支。

谢谢!

2 个答案:

答案 0 :(得分:1)

我稀疏,您正在寻找特定的git命令:

git reflog

这向您显示了过去存储库(包括所有已删除的分支)发生了什么情况。如果您的存储库很大,则可以使用grep过滤其输出。

答案 1 :(得分:1)

TL; DR

运行:

git fetch --prune

(如果愿意,可以缩写为git fetch -p),或者:

git remote origin prune

这两个都应该做同样的事情,但是在某些版本的Git中(我不记得是哪个版本,因为它们已经相当老了,也许是1.8年代的时代)。远程跟踪名称。

超长

运行git fetch时,您的Git:

  • 通常在某些Internet URL上调用另一个Git
  • 让Git列出其所有分支名称(和其他名称)以及随之而来的提交哈希ID;
  • 检查其他Git是否具有您不需要的提交;
  • 从另一个Git获取那些提交;最后,
  • 为列出的其他Git的部分或全部分支名称创建或更新远程跟踪名称

(最后一部分中的“部分或全部”说明了以下事实:运行git fetch的某些方式会限制您的Git要求和/或查找的名称。我们在此不再使用这些名称,但请注意,如果您设置了单分支克隆,则要求Git设置 default 仅查看该名称。在此,我假设您尚未设置单个-分支克隆。 1

这里的问题很简单。假设在星期一,您运行git fetchgit fetch origin,并且您的Git在某个GitHub URL或任何其他位置调用Git。 他们的 Git目前具有三个分支:masterfeature/afeature/b。因此,您的 Git会创建或更新您的origin/masterorigin/feature/aorigin/feature/b

现在是星期二,您再次运行git fetch。您的Git调用了他们的Git,由于两个功能都已合并,所以它们降到master了。因此,您的Git会获取所需的所有新提交,然后更新您的origin/master。没有feature/a;没有feature/b;因此您的Git 对这两个不存在的名称不做任何操作。您的origin/feature/a被遗弃,而您的origin/feature/b被遗弃。

您现在有了两个过时的远程跟踪名称!

您可以手动删除它们:

 git branch -r -d origin/feature/a origin/feature/b

但是让Git认识到,gee必须自己创建了 origin/feature/aorigin/feature/b,这要方便得多,所以也许它应该< em>现在也可以自行删除。 --prune选项正是这样做的:它获取了他们给您的完整列表,并使用它来减少必须早先遗留下来的所有远程跟踪名称。


1 要找出答案,请运行:

git config --get-all remote.origin.fetch

如果仅打印一行:

+refs/heads/*:refs/remotes/origin/*

您有一个标准的日常设置。如果没有,则您可能具有单分支克隆;至少,您设置了一些不寻常的内容。


您可以将修剪设置为默认设置

使用:

git config --global fetch.prune true

您可以告诉Git您希望所有存储库的git fetch默认为 git fetch --prune (即--global部分)。或者,省去--global来为一个特定的存储库设置此设置。

我所知道的唯一一个非常小的缺点是,如果有人不小心删除了origin上的某个分支,并且您设置了此选项并运行了git fetch origin,则Git会删除您的远程服务器,跟踪名称,您可以早先使用它来在位于origin的Git中恢复分支名称。换句话说,它会更改您的设置,从而使您无法挽救其他愚蠢的人。如果要拯救他人不在您的工作清单中,那将是次要的事情。

相关问题