我删除了一堆BitBucket分支。我希望我的本地用户能够反映出来,而不必手动删除每个分支。我应该能够做一些事情,“使我的本地设备与我的遥控器匹配,就像我刚刚进行了一次新的克隆一样。”
edit:我不希望使用几个步骤的脚本进行grep和搜索,也不希望只删除我的项目并重新克隆-这应该是GIT中内置的简单功能。真的只有8个分支,所以我可以不花太多力气就手动完成,但是我正在尝试在这里学习更好的方法。
edit2:链接的答案之一表明:
git remote prune origin
修剪不在远程上的跟踪分支。
这看起来像我想要的,但是它不会删除任何本地分支。它说对许多起源/分支都进行了修剪,但是git branch
仍然显示了我的所有不存在于遥控器中的旧分支。
答案 0 :(得分:0)
TL; DR:您真正想要的是fetch.prune
设置。不过,我将回答您提出的问题,而不是您应该提出的问题。 :-)
要将现有克隆转变为看起来像新克隆的克隆,至少需要四个步骤。
运行git fetch -p
。或者,在本地存储库或每用户设置中将fetch.prune
配置为true
,然后运行git fetch
。这将删除存储库中与origin/*
处曾经存在但不再存在的分支名称相对应的origin
个远程跟踪名称。
手动删除所有不需要的分支-除一个以外的所有分支。为此,您必须签出您愿意保留的那个。如果愿意,可以自动执行此删除操作,但是请注意,如果有提交但从未向上游发送过,则此时可能会丢失这些提交。见下文。
git reset --hard
您剩余的分支机构到其远程跟踪对等机构。此时您可能会丢失一些提交。见下文。
运行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-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
的{{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跟踪的所有其他事情。