如何使GIT本地匹配远程(就像刚刚克隆)?

问题描述 投票:0回答:2

我删除了一堆BitBucket分支。我希望我的本地反映,而无需手动删除每个分支。我应该可以做些什么来“让我的本地比赛我的遥控器,好像我刚做了一个新的克隆。”

编辑:我不想要几个步骤脚本来grep和搜索东西,我也不想删除我的项目并重新克隆 - 这应该是GIT中内置的简单功能。它真的只有8个分支,所以我可以手动完成而不需要太多努力,但我正在努力学习更好的方法来做到这一点。

edit2:其中一个链接的答案表明:

git remote prune origin修剪跟踪分支机构不在遥控器上。

这看起来像我想要的,但它不会删除任何本地分支。它说为许多起源/分支修剪,但git branch仍然显示我在遥控器中不存在的旧分支。

git bitbucket-server
2个回答
0
投票

TL; DR:你真正想要的是fetch.prune设置。不过,我会回答你问的问题,而不是你应该问的问题。 :-)

要将现有克隆转换为新的克隆,您至少需要四个步骤。

  1. 运行git fetch -p。或者,在本地存储库或每用户设置中将fetch.prune配置为true并运行git fetch。这将删除存储库中与origin/*存储库中曾经但不再存在的分支名称对应的任何origin远程跟踪名称。
  2. 手动删除任何您不想要的分支 - 除了一个分支。要做到这一点,你必须检查你愿意保留的那个。如果您愿意,可以自动执行此删除操作,但请注意,如果您从未向上游发送过提交,则此时可能会丢失这些提交。见下文。
  3. git reset --hard你的剩余分支到他们的远程跟踪对应物。此时您可能会丢失一些提交。见下文。
  4. 运行git clean -dfx。见下文。

你现在拥有类似于新鲜克隆的东西,除了这些项目:

  • 你的HEAD的reflog仍然有你最近的所有活动,可能会保留一些提交。您也可以使用git reflog expire --expire=all --expire-unreachable=all清理它。
  • 你仍然存在任何藏匿处。你可以用git stash clear将它们全部丢弃。
  • 您所做的任何不寻常的参考仍然存在(例如,来自refs/notes/refs/replace/git replace)。如果需要,您必须手动删除它们。
  • 任何浅克隆状态都会持续存在。你可以使用git fetch --unshallow清除它。
  • 某些假设未更改或跳过工作树位仍可在索引中设置。您可以使用git update-index --no-assume-unchangedgit update-index --no-skip-worktree来解决这些问题。如果你先设置这些位,你只需要这样做; Git从不自己设置它们。

(我认为这是一切,但我可​​能会错过一两件事。)

Notes

如果你要做一个新的git clone,你会:

  • 创建一个新的空存储库:mkdir name; cd name; git init
  • 使用适当的URL添加一个名为origin的远程:git remote add origin url
  • 运行git fetch以获取其所有现有分支作为您的origin/*远程跟踪名称
  • 选择其中一个分支(根据您对-bgit clone参数)在本地创建
  • 运行git checkout name,从origin/name创建名称。

此新存储库具有在步骤1(修剪提取)后保留的相同远程跟踪名称,因此步骤1修复了远程跟踪名称。它没有分支名称 - 没有refs/heads/*引用 - 除了在最后一步中创建的引用,因此第2步删除了这些。你当然是在剩下的一个分支上,所以第2步包括git checkout name和第3步,git reset --hard,使你的分支名称指向正确的提交,同时更新你的所有索引和你的大多数工作树。

当然,未跟踪的文件和目录可能仍然存在,因此第4步,git clean -dfx,让Git删除它们,包括.gitignore指令忽略的文件。

要自动删除不是当前分支的分支,您需要一个小脚本。链接问题中有一些(可能重复)。但这些删除你的分支,这不是任何其他人的分支。你不应该随意删除它们:当你完成它们时你应该已经自己删除了它们,所以应该没有什么可以删除的。这就是列出步骤2和3的原因,但不应该这样做 - 至少不是自动完成的。

最后一个操作git clean -dfx删除了构建工件(例如,编译的*.o文件或*.pyc字节编码的Python文件)。通常,您希望在您自己的控制下手动执行此操作,而不仅仅是因为上游已发生某些变化。


0
投票

我已经看到了很多好的建议,但看起来真正的答案是GIT不提供比删除项目和使用GIT克隆更简单的命令。 IMO应该有一个命令,所有分支和其他GIT跟踪的git reset --hard

© www.soinside.com 2019 - 2024. All rights reserved.