是否有一个 git 命令可以解决错误:未找到远程分支 'refs/heads/foo/bar' ?

Nay*_*lor 5 git pull fetch refspec

在我的情况下,我正在跟踪其他人合并和删除的远程修补程序分支。

我已经删除了本地分支,但是当我拉取时,我仍然收到上述错误,因为我的 git 配置文件中有以下几行:

[remote "origin"]
...
    fetch = +refs/heads/foo/bar:refs/remotes/origin/foo/bar
    push = +refs/heads/foo/bar:refs/for/foo/bar
...
Run Code Online (Sandbox Code Playgroud)

可以通过从文件中删除这些行来解决该错误,但有没有办法从命令行执行此操作?

tor*_*rek 5

有,但如果您只想删除一个匹配行,它通常比手动编辑困难得多。

修改git配置文件的命令是git config。它具有--unset--unset-all、 和--remove-section选项,用于删除某个特定部分或键中的一个、所有匹配或所有条目。

在本例中,该部分是remote.origin(因为它位于[remote "origin"]文件中),键是remote.origin.fetch. 在这种情况下,您不想删除整个部分,因此留下--unset--unset-all作为可能性。

可以有多条fetch线,也可以多条push线。换句话说,一个密钥可以有多个具有不同值的副本。

如果只有一行remote.origin.fetch,并且您想删除它,您可以简单地:

git config --unset remote.origin.fetch
Run Code Online (Sandbox Code Playgroud)

如果您在具有多个提取行的存储库上尝试此操作,您将得到:

warning: remote.origin.fetch has multiple values
Run Code Online (Sandbox Code Playgroud)

你会发现没有任何内容被删除(至少这是我在 git 2.1.0 中得到的)。在这种情况下,您需要更复杂的变体,要么--unset-all(删除所有remote.origin.fetch)或(删除值与 匹配的键)。--unset key value_regexvalue_regex

由于您可能只想取消设置一个匹配行,因此您必须想出一个与该行且仅与该行匹配的正则表达式。通读文档git config以找到合适的正则表达式请注意,由于这些是 POSIX“扩展”RE,因此裸+字符意味着“一个或多个前一个字符”,因此+refs/...不起作用,因为缺少“前一个字符”部分。(根据文档,这些显然也没有锚定。)在这种情况下,:refs/remotes/origin/foo/bar可能就足够了,但您可以变得更奇特。

要删除该push条目,请重复上述步骤,但以remote.origin.push为键。

(或者只是使用您最喜欢的编辑器并交互式删除正确的行,这要容易得多,尽管不太适合脚本......)