如何从 Git 中删除无效的远程分支引用?

Posted

技术标签:

【中文标题】如何从 Git 中删除无效的远程分支引用?【英文标题】:How do you remove an invalid remote branch reference from Git? 【发布时间】:2010-11-07 12:21:20 【问题描述】:

在我当前的仓库中,我有以下输出:

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master

我想从分支列表中删除remotes/public/master

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.

另外,git remote 的输出很奇怪,因为它没有列出 public

$ git remote show 
origin

如何从分支列表中删除“remotes/public/master”?

更新,尝试git push 命令:

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

【问题讨论】:

git remote prune [remote-name]git fetch -p [remote-name] 在您的场景中不起作用吗?使用git gc 执行此操作比通常需要的要强大得多。 git remote prune [remote-name] 不能与 git svn 一起工作,尽管 git gc... git branch -rd origin/name 也不能工作。 @Casey,您可能应该选择第二个答案 - 它的危险性略低。 我喜欢这个问题。几乎每个月都会回来 相关的,如果不是欺骗目标:Delete a Git branch both locally and remotely. 为避免将来出现 n00b gitter 错误,我建议使用与master 不同的示例分支...尤其是在远程删除时。 【参考方案1】:

您可能需要清理:

git gc --prune=now

或者您可能需要修剪:

git remote prune public

修剪

删除 下所有过时的跟踪分支。这些陈旧的分支已从 引用的远程存储库中删除,但仍可在本地“remotes/”中使用。

使用 --dry-run 选项,报告将修剪哪些分支,但不要实际修剪它们。

但是,这些似乎应该早点用

清理
git remote rm public 

rm

移除名为 的遥控器。远程的所有远程跟踪分支和配置设置 被删除。

所以可能是您手动编辑了配置文件而这没有发生,或者您有权限问题。

也许再运行一次,看看会发生什么。


建议上下文

如果您查看revision logs,您会注意到我建议了更多“正确”的技术,无论出于何种原因,这些技术都不想在他们的存储库上工作。

我怀疑 OP 做了一些事情,导致他们的树处于不一致的状态,导致它的行为有点奇怪,需要git gc 来修复遗留的垃圾。

通常 git branch -rd origin/badbranch 足以 nuking 本地跟踪分支,或 git push origin :badbranch 足以 nuking 远程分支,通常你将 永远不会 em> 需要拨打git gc

【讨论】:

我不想删除远程端的分支。我认为有细微的差别。 er,问题实际上是在问“我如何删除远程分支”。那就是那些路径。 如果这样可以更清楚地说明我要问的内容,我将重新表述主题,但该命令准确地显示了我的问题。 git gc 这里不需要,但git remote prune 让我感觉比使用git branch -rd 手动删除内容更安全,因为 git 正在验证哪些远程分支已完成。 这对我不起作用 - 但是,'git branch -rd' 工作得很好。【参考方案2】:
git push public :master

正如 Kent Fredric 指出的那样,这将删除名为 master 的远程分支。

列出远程跟踪分支:

git branch -r

删除远程跟踪分支:

git branch -rd public/master

【讨论】:

这帮助我删除了一个 git-svn 远程幽灵分支。 git branch -rd removed_remote/branch 为我工作,而 git gc --prune=now 毫无价值。 我可以毫无问题地使用git prune,但是我的同事分叉了我们的主仓库**只能**使用git branch -rd public/master风格的解决方案来清理他的环境起来。 git branch -rd public/master 是我所缺少的。我有heroku/masterherkou/master ...哈哈哇 @rchampourlier 并非 100% 毫无价值 - 如果您的 git 存储库很大,在某些情况下删除未使用的分支可以释放大量磁盘空间。【参考方案3】:

git gc --prune=now 不是你想要的。

git remote prune public

git remote prune origin # 如果那是远程源

是你想要的

【讨论】:

@Casey $ git gc # 确实喜欢对 git 文件进行碎片整理以加速存储库 $ git remote prune origin # 将清理删除显示为“git branch -”的陈旧远程分支r | grep 来源”。这就是我相信的问题。所以,命令是完全不同的。【参考方案4】:

当引用被打包时,接受的答案对我不起作用。然而,这确实:

$ git remote add public http://anything.com/bogus.git
$ git remote rm public

【讨论】:

为我工作。常规 git branch -d 不起作用,返回分支不存在的错误,因为我直接在 .git/config 文件中删除了错误创建的名为“original”的源。 这是我必须使用的方法来删除无意中从我的 .git/config 中遗漏的分支(由于不相关的损坏而必须重建)。太糟糕了,这个答案太落后了,直到我终于找到了解决方案并将其添加到接受的答案中,我才注意到它! 这是我使用svn2git后需要的。有很多 remotes/svn/* 分支。必须先创建一个伪造的“svn”遥控器。【参考方案5】:

你需要做的就是

$ git branch -rd origin/whatever 

就这么简单。这里没有理由调用 gc。

【讨论】:

你如何将删除“推送”到 github? @Thufir 这不是这个问题的目的。此问题专门针对本地存储库中的远程引用无效但远程服务器上不再存在该分支的情况。你的问题的答案是 $ git push origin :whatever 是的,如果在删除分支的远程仓库上发生了某些事情,但您仍然可以在本地计算机上引用该远程分支,那么您需要按照我在原始答案中所做的操作清理它。 如果你有一个大的清理工作(很多悬空的遥控器),你可以用git branch -rd $(git branch -r)之类的东西删除所有远程分支,然后通过获取来重新建立有效的分支。 我的情况是我使用git config -e 重命名了我的遥控器。我将遥控器mine 重命名为origin。然后,这是最适合我的解决方案:git branch -rd $(git branch -r | grep 'mine/')【参考方案6】:

你需要做的就是

git fetch -p

它将删除所有远程删除的本地分支。

如果你使用 git 1.8.5+,你可以自动设置这个

git config fetch.prune true

git config --global fetch.prune true

【讨论】:

这也是我一直在寻找的——问题是描述一个比普通场景更复杂的场景。 我正在寻找一种方法来删除已删除相应远程的本地分支,但这对我不起作用。知道为什么吗? 这会删除 remote/origin 中列出的分支,但不会删除本地跟踪分支,这同样重要。 @Cupcake 由于您没有回滚我的第一次编辑(修复了有关 Git 1.8.5+ 的不正确信息),因此您现在已使此错误。我的第二个编辑是修复我输入的不正确的内容,现在又出现了(您的回滚)。请继续并回滚一次编辑以获得原始版本。谢谢。 @ferventcoder 我仔细检查了您的上一次编辑,然后回滚。如果他不喜欢,OP 可以再次回滚。谢谢。【参考方案7】:

我遇到了类似的问题。没有一个答案有帮助。就我而言,我有两个已删除的远程存储库永久显示。

我最后的想法是手动删除所有对它的引用。

假设存储库名为“Repo”。我做到了:

find .git -name Repo 

所以,我从 .git 文件夹中删除了相应的文件和目录(这个文件夹可以在你的 Rails 应用程序或计算机上找到https://***.com/a/19538763/6638513)。

然后我做了:

grep Repo -r .git

这发现了一些我删除了相应行的文本文件。 现在,一切似乎都很好。

通常,你应该把这份工作留给 git。

【讨论】:

【参考方案8】:
git push origin --delete <branch name>

引用自:http://www.gitguys.com/topics/adding-and-removing-remote-branches/

【讨论】:

【参考方案9】:

就我而言,我试图删除保存在.git/packed-refs 中的条目。您可以编辑此纯文本文件并从中删除 git br -D 不知道如何触摸的条目(至少在 1.7.9.5 版中)。

我在这里找到了这个解决方案:https://***.com/a/11050880/1695680

【讨论】:

哇,这对我有帮助。我的同事尝试过,重新启动 VS,重新启动他的计算机没有任何效果,他删除了他的本地 repo 并删除了所有内容以摆脱这个:) 今天我认为这个打包的引用文件是作为git gc 的一部分创建的,当它将您的提交打包到一个高度压缩的存档中时,它还会将引用移动到一个纯文本文件中,可能出于优化目的;我希望未来版本的 git 可以git br -D ...打包参考。【参考方案10】:

我不知道git branch -rd,所以我为自己解决此类问题的方法是将我的回购视为远程回购并进行远程删除。 git push . :refs/remotes/public/master。如果其他方法不起作用并且您想摆脱一些奇怪的参考,那么这种原始方法是肯定的。它为您提供删除(或创建!)任何类型参考的精确精度。

【讨论】:

【参考方案11】:

只是稍微相关,但在与我们相同的情况下仍然可能会有所帮助 - 我们为远程存储库使用网络文件共享。上周一切正常,本周我们收到错误“远程源没有为分支 refs/heads/master 发布 Ref。此 Ref 可能不存在于远程中,或者可能被权限设置隐藏”

但我们相信没有采取任何措施来破坏事物。 NFS 会做快照,所以我查看了每个“以前的版本”,发现三天前,存储库的大小(以 MB 为单位)从 282MB 变为 33MB,现在大约有 1,403 个新文件和 300 个文件夹。我询问了我的同事,其中一位试图在那天进行推送 - 然后取消了。

我使用 NFS 的“恢复”功能将其恢复到该日期之前,现在一切正常。我之前确实尝试过修剪,似乎没有帮助。也许更严厉的清理工作会奏效。

希望有一天这可能对其他人有所帮助!

【讨论】:

【参考方案12】:

不确定我是如何陷入混乱的,但我的错误信息略有不同:

> git 远程
> git 分支
  警告:忽略损坏的 ref refs/remotes/origin/HEAD
  * 主要>

但我能够通过稍微重新解释此 page 上其他地方的修复来修复它。我的意思是我用关键字HEAD 替换了&lt;remote&gt;/&lt;branch&gt; 中的分支名称。人们提到的其他建议都没有奏效(gcprune 等),所以我的想法已经用完了,希望最好。无论如何,它就像一个魅力:

> git remote> git branch -rd origin/HEAD
  已删除远程跟踪分支 origin/HEAD(原为 refs/remotes/origin/main)。> git branch * main>

【讨论】:

【参考方案13】:

我在这里尝试了所有方法,但没有任何效果。如果一切都失败了,请从文本文件 '.git/packed-refs' 中删除有问题的分支,然后从 '.git\refs\remotes\origin' 中删除有问题的分支

【讨论】:

以上是关于如何从 Git 中删除无效的远程分支引用?的主要内容,如果未能解决你的问题,请参考以下文章

git常用操作

如何删除git远程分支(转)

Git 如何删除本地分支和远程分支

你如何停止在 Git 中跟踪远程分支?

怎么删除git本地分支以及Bitbucket的远程分支?

是否可以从 Git 分支(本地和远程)中删除特定的提交? [复制]