删除浅层克隆中的分支

时间:2017-02-15 13:00:38

标签: git

我正在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>

我有问题。当我pullfetch时收到错误消息

  

致命:无法找到远程参考号&lt; branch-name&gt;

没有与--remove对应的git remote set-branches --add选项,那么如何删除丢失的分支?是编辑.git / config文件来删除行

fetch = +refs/heads/<branch-name>:refs/remotes/origin/<branch-name>

还是有一种隐藏的方式可以做到这一点?我很惊讶推动分支删除没有修剪获取行。

1 个答案:

答案 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 

但是,如果任何本地分支实际上不是为了跟踪原点,那就会出现问题。