我删除了一堆BitBucket分支。我希望我的本地反映,而无需手动删除每个分支。我应该可以做些什么来“让我的本地比赛我的遥控器,好像我刚做了一个新的克隆。”
编辑:我不想要几个步骤脚本来grep和搜索东西,我也不想删除我的项目并重新克隆 - 这应该是GIT中内置的简单功能。它真的只有8个分支,所以我可以手动完成而不需要太多努力,但我正在努力学习更好的方法来做到这一点。
edit2:其中一个链接的答案表明:
git remote prune origin
修剪跟踪分支机构不在遥控器上。
这看起来像我想要的,但它不会删除任何本地分支。它说为许多起源/分支修剪,但git branch
仍然显示我在遥控器中不存在的旧分支。
TL; DR:你真正想要的是fetch.prune
设置。不过,我会回答你问的问题,而不是你应该问的问题。 :-)
要将现有克隆转换为新的克隆,您至少需要四个步骤。
git fetch -p
。或者,在本地存储库或每用户设置中将fetch.prune
配置为true
并运行git fetch
。这将删除存储库中与origin/*
存储库中曾经但不再存在的分支名称对应的任何origin
远程跟踪名称。git reset --hard
你的剩余分支到他们的远程跟踪对应物。此时您可能会丢失一些提交。见下文。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-unchanged
和git update-index --no-skip-worktree
来解决这些问题。如果你先设置这些位,你只需要这样做; Git从不自己设置它们。(我认为这是一切,但我可能会错过一两件事。)
如果你要做一个新的git clone
,你会:
mkdir name; cd name; git init
origin
的远程:git remote add origin url
git fetch
以获取其所有现有分支作为您的origin/*
远程跟踪名称-b
的git 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文件)。通常,您希望在您自己的控制下手动执行此操作,而不仅仅是因为上游已发生某些变化。
我已经看到了很多好的建议,但看起来真正的答案是GIT不提供比删除项目和使用GIT克隆更简单的命令。 IMO应该有一个命令,所有分支和其他GIT跟踪的git reset --hard
。