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

How to make GIT local match remote (as if just cloned)?

我删除了一堆 BitBucket 分支。我希望我的本地人能够反映这一点,而不必手动删除每个分支。我应该可以为 "just make my local match my remote as if I just did a fresh clone."

做些什么

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

edit2:链接的答案之一建议:

git remote prune origin prunes tracking branches not on the remote.

这看起来像我想要的,但它不会删除任何本地分支。它说修剪了许多 origin/ 分支,但 git branch 仍然显示远程中不存在的所有旧分支。

TL;DR:您真正想要的是 fetch.prune 设置。尽管如此,我还是要回答你提出的问题,而不是你应该回答的问题。 :-)

要将您现有的克隆变成一个看起来像新克隆的东西,您至少需要四个步骤。

  1. 运行git fetch -p。或者,在您的本地存储库或您的每个用户设置中将 fetch.prune 配置为 true 和 运行 git fetch。这将删除存储库中与分支名称对应的任何 origin/* 远程跟踪名称,这些分支名称曾经但不再存在于 origin.

  2. 的存储库中
  3. 手动删除任何您不想要的分支——除了一个。为此,您必须检查您愿意保留的那个。如果您愿意,可以自动执行此删除操作,但请注意,如果您有从未发送到上游的提交,此时您可能会丢失这些提交。见下文。

  4. git reset --hard 你剩余的分支到他们的远程跟踪同行。此时您可能会丢失一些提交。见下文。

  5. 运行git clean -dfx。见下文。

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

  • 您的 HEAD 的引用日志仍然包含您最近的所有 activity,其中可能会保留一些提交。您也可以使用 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 从不自行设置它们。

(我想就这些了,但我可能会遗漏一两个项目。)

备注

如果你要重新做 git clone,你会:

  • 创建一个新的空仓库:mkdir <em>name</em>; cd <em>名字</em>; git初始化
  • 使用适当的 URL 添加一个名为 origin 的遥控器: git remote add origin <em>url</em>
  • 运行 git fetch 获取其所有现有分支作为您的 origin/* 远程跟踪名称
  • 选择其中一个分支(基于您对 git clone-b 参数)在本地创建
  • 运行 git checkout <em>name</em>,创建 name 来自来源/<em>名称</em>.

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

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

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

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

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