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

时间:2019-02-20 19:23:56

标签: git bitbucket-server

我删除了一堆BitBucket分支。我希望我的本地用户能够反映出来,而不必手动删除每个分支。我应该能够做一些事情,“使我的本地设备与我的遥控器匹配,就像我刚刚进行了一次新的克隆一样。”

edit:我不希望使用几个步骤的脚本进行grep和搜索,也不希望只删除我的项目并重新克隆-这应该是GIT中内置的简单功能。真的只有8个分支,所以我可以不花太多力气就手动完成,但是我正在尝试在这里学习更好的方法。

edit2:链接的答案之一表明:

  

git remote prune origin修剪不在远程上的跟踪分支。

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

2 个答案:

答案 0 :(得分: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的引用日志仍具有您最近的所有活动,其中可能保留一些提交。您也可以使用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 name; cd name; git init
  • 使用适当的URL:origin
  • 向其中添加名为git remote add origin url的远程服务器
  • 运行git fetch以获取其所有现有分支作为您的origin/*远程跟踪名称
  • 选择其中一个分支(基于您对-b的{​​{1}}参数)在本地创建
  • 运行git clone,它从git checkout name创建名称

此新存储库具有与步骤1(修剪访存)相同的远程跟踪名称,因此步骤1修复了您的远程跟踪名称。除了在最后一步中创建的分支名称之外,它没有分支名称(没有origin/name引用),因此第2步将其删除。当然,您在该分支上,因此步骤2包含refs/heads/*和步骤3 git checkout name,在更新所有索引和大部分工作时,使分支名称指向正确的提交-树。

当然,未跟踪的文件和目录可能会保留,因此第4步git reset --hard使Git删除了它们,包括git clean -dfx指令忽略的文件。

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

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

答案 1 :(得分:0)

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