Git fetch:远程仓库不断删除和添加分支

5
每次我从所有远程仓库获取代码时,来自另一个用户的远程仓库总是会出现分支被删除再重新添加的情况:

带有剪枝(prune)选项的获取:

git -c diff.mnemonicprefix=false -c core.quotepath=false fetch --prune jcaseiro
From https://my.url.com/jcaseiro/project-android
 x [deleted]         (none)     -> jcaseiro/Sprint8/bugfix/SIMSwap-Master
 x [deleted]         (none)     -> jcaseiro/Sprint8/bugfix/addCheckForNullLinkFragment
 x [deleted]         (none)     -> jcaseiro/Sprint8/bugfix/fixErrorRedirectsPPEScreen
 x [deleted]         (none)     -> jcaseiro/Sprint8/bugfix/fixNullPointerExceptionDropboxInfo
 x [deleted]         (none)     -> jcaseiro/sprint7/bugfix/Fix_clickable_almost_there_screen
 x [deleted]         (none)     -> jcaseiro/sprint7/bugfix/PromoTextAlbanianString
 x [deleted]         (none)     -> jcaseiro/sprint7/bugfix/addCheckForNullLinkFragment
 x [deleted]         (none)     -> jcaseiro/sprint7/bugfix/fixPPEErrorRedirects

 * [new branch]      Sprint7/bugfix/Fix_clickable_almost_there_screen -> jcaseiro/Sprint7/bugfix/Fix_clickable_almost_there_screen
 * [new branch]      Sprint7/bugfix/LogoutNotificationProblem -> jcaseiro/Sprint7/bugfix/LogoutNotificationProblem
 * [new branch]      Sprint7/bugfix/PromoTextAlbanianString -> jcaseiro/Sprint7/bugfix/PromoTextAlbanianString
 * [new branch]      Sprint7/bugfix/addCheckForNullLinkFragment -> jcaseiro/Sprint7/bugfix/addCheckForNullLinkFragment
 * [new branch]      Sprint7/bugfix/fixPPEErrorRedirects -> jcaseiro/Sprint7/bugfix/fixPPEErrorRedirects
 * [new branch]      Sprint7/bugfix/fixWrongBehaviorBroke -> jcaseiro/Sprint7/bugfix/fixWrongBehaviorBroke
 * [new branch]      Sprint7/bugfix/fixWrongBehaviorBroke1.3 -> jcaseiro/Sprint7/bugfix/fixWrongBehaviorBroke1.3
 * [new branch]      Sprint8/Bugfix/SIMSwap-Master -> jcaseiro/Sprint8/Bugfix/SIMSwap-Master
 * [new branch]      Sprint8/Bugfix/addCheckForNullLinkFragment -> jcaseiro/Sprint8/Bugfix/addCheckForNullLinkFragment
 * [new branch]      Sprint8/Bugfix/fixErrorRedirectsPPEScreen -> jcaseiro/Sprint8/Bugfix/fixErrorRedirectsPPEScreen
 * [new branch]      Sprint8/Bugfix/fixNullPointerExceptionDropboxInfo -> jcaseiro/Sprint8/Bugfix/fixNullPointerExceptionDropboxInfo

即使我删除远程端并重新添加,它仍然会发生。这只会在特定的远程端出现问题,但我认为我的本地 git 出了问题,因为这个项目的其他开发人员没有遇到类似的事情。

每次拉取时都不进行修剪:

 git -c diff.mnemonicprefix=false -c core.quotepath=false fetch jcaseiro
From https://my.url.com/jcaseiro/project-android

 * [new branch]      Sprint7/bugfix/Fix_clickable_almost_there_screen -> jcaseiro/Sprint7/bugfix/Fix_clickable_almost_there_screen
 * [new branch]      Sprint7/bugfix/LogoutNotificationProblem -> jcaseiro/Sprint7/bugfix/LogoutNotificationProblem
 * [new branch]      Sprint7/bugfix/PromoTextAlbanianString -> jcaseiro/Sprint7/bugfix/PromoTextAlbanianString
 * [new branch]      Sprint7/bugfix/addCheckForNullLinkFragment -> jcaseiro/Sprint7/bugfix/addCheckForNullLinkFragment
 * [new branch]      Sprint7/bugfix/fixPPEErrorRedirects -> jcaseiro/Sprint7/bugfix/fixPPEErrorRedirects
 * [new branch]      Sprint7/bugfix/fixWrongBehaviorBroke -> jcaseiro/Sprint7/bugfix/fixWrongBehaviorCloudBroker
 * [new branch]      Sprint7/bugfix/fixWrongBehaviorBroke1.3 -> jcaseiro/Sprint7/bugfix/fixWrongBehaviorCloudBroker1.3
 * [new branch]      Sprint8/Bugfix/SIMSwap-Master -> jcaseiro/Sprint8/Bugfix/SIMSwap-Master
 * [new branch]      Sprint8/Bugfix/addCheckForNullLinkFragment -> jcaseiro/Sprint8/Bugfix/addCheckForNullLinkFragment
 * [new branch]      Sprint8/Bugfix/fixErrorRedirectsPPEScreen -> jcaseiro/Sprint8/Bugfix/fixErrorRedirectsPPEScreen
 * [new branch]      Sprint8/Bugfix/fixNullPointerExceptionDropboxInfo -> jcaseiro/Sprint8/Bugfix/fixNullPointerExceptionDropboxInfo

仅供参考,我正在使用SourceTree,但通过命令行执行具有完全相同的效果。

我已经搜索了很多,但没有找到答案...


当您不指定 --prune 时会发生什么?也许您的跟踪不正确,导致无谓地进行修剪。 - Thomas Stringer
是的。但每次我获取时,都会添加相同的“新分支”。 - neteinstein
你的 $ git branch -a 是什么样子? - Thomas Stringer
我有所有在fetch中显示为“新分支”的那些分支。 - neteinstein
2
新创建的分支与旧分支的大小写不同。可能是由于远程机器使用了不区分大小写的文件系统,而您使用了区分大小写的文件系统所导致的问题。 - Sven Marnach
显示剩余3条评论
1个回答

2
如果你在Windows上使用git,当以下情况发生时,你会遇到问题:
  • 有多个分支仅通过大小写区分,或
  • 将分支重命名为不同的大小写。
请查看您的repo的.git / refs / remotes /以了解情况。将其与git ls-remote进行比较。最好不要直接触碰那些.git文件,而是使用git命令来操纵它们,以避免损坏本地存储库。
如果将分支重命名为不同的大小写,则需要清理git引用,例如:
git update-ref -d Sprint8/Bugfix/SIMSwap-Master

您需要为每个被删除并重新创建的分支重复此操作,每次获取时都需要这样做。如果文件夹的大小写发生了变化,您可能需要详细地使用git update-ref -d来删除整个引用文件夹。 (我刚刚对大约200个分支执行了vim宏以生成200条命令-据我所知,没有选项可以递归地git update-ref -d引用文件夹)。下一次获取将最后一次获取任何重命名的分支,但随后的获取将不再获取该分支。
如果该分支不仅仅是被重命名,而是实际上存在多个只有大小写不同的分支,则应要求创建分支的开发人员删除额外的分支,以便没有仅因大小写而不同的分支。在没有不同大小写的重复分支之前,每次获取时您都会继续看到相同的分支。
在Windows git bash上,您可以尝试使用以下命令列出所有仅因大小写而不同的分支:
git ls-remote --refs origin | tr '[A-Z]' '[a-z]' | sort | uniq -c | grep -v $' 1\t'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接