我正在git存储库的浅层克隆中工作。由于浅克隆只列出.git / config文件中的一个远程跟踪分支,为了获得新的远程分支,我需要显式添加它们。例如
git clone --depth 1 <remote-url>
git remote set-branches --add origin <branch-name>
git fetch --depth 1 origin <branch-name>
git checkout <branch-name>
稍后如果我删除分支
git checkout master
git branch --delete <branch-name>
并将删除推送到远程
git push --delete origin <branch-name>
我有问题。当我pull
或fetch
时收到错误消息
致命:无法找到远程参考号&lt; branch-name&gt;
没有与--remove
对应的git remote set-branches --add
选项,那么如何删除丢失的分支?是编辑.git / config文件来删除行
fetch = +refs/heads/<branch-name>:refs/remotes/origin/<branch-name>
还是有一种隐藏的方式可以做到这一点?我很惊讶推动分支删除没有修剪获取行。
答案 0 :(得分:1)
选项1:避免问题?
如果你没有明确告诉git你希望它获取哪些分支,那么可以避免这个问题。 (但是如果你只需要获取一组选定的分支,可能最好跳到选项2.)当你创建克隆时,你可以说你想要所有的分支
git clone --depth=1 --no-single-branch ...
或者,如果您已经克隆并想要获得其余分支:从您的指示,而不是
git remote set-branches --add origin <branch-name>
配置抓取以查找特定分支,您可以
git config --unset remote.origin.fetch
git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git fetch --depth=1
删除分支(本地和远程)不再导致问题。
(您可以使用更具选择性的模式,但如果您不想要“一切”,可以选择单独的分支。)
如果您已经拥有存储库并按照上面描述的方式添加了一些分支,那么类似于我列出的配置命令应该“修复”它。 (只需在第一个命令中将--unset
替换为--unset-all
。)
选项2:解决问题
但如果您确实需要配置列出单个分支,则可以通过以下方式之一处理删除:
您可以使用git config
直接删除设置,而无需手动编辑任何文件。
git config --unset remote.origin.fetch <branch-name>
请注意<branch-name>
被解释为正则表达式,如果它匹配多个值,那么它将无效。因此,如果您收到有关多个匹配值的警告,则必须执行类似
git config --unset remote.origin.fetch origin.<branch-name>$
或者您可以使用git remote set-branches
:
虽然没有明确的git remote set-branches --remove
或类似的任何内容,但您可以使用set-branches
而不使用 --add
标志来重置远程列表分支完全。如果你没有太多其他分支,这将有效。例如,只给出上面显示的内容
git remote set-branches origin master
但是如果你添加了许多其他分支,你必须列出它们或丢失它们。
git remote set-branches origin master branch1 branch2 branch3 ...
您可以自动完成获取分支列表的过程
git branch | sed s/'\* '// | xargs git remote set-branches origin
但是,如果任何本地分支实际上不是为了跟踪原点,那就会出现问题。