2017-08-07 108 views
2

我们团队使用的自定义Git工具会为每个正在处理的新功能/错误创建一个分支。删除分支 - >安全地编辑.git/refs/heads文件?

通常情况下,当更改接近完成时,远程分支将通过另一个工具进行更改,从而使分支的本地副本不同步。

经常出现的一个问题是如何清理所有留在开发人员本地存储库中的陈旧分支。因为输入很多git branch -D branchname可能会令人厌倦,当有几十个这些陈旧的分支。

我一直给出的一些建议是从他们的.git/refs/heads文件夹中删除文件。

这里是我送出去的全文:

一个手工技巧,在批量快速删除树枝是从你的.git/refs/heads folder删除 文件。你会看到 对应分支的文件名。一个分支只是一个指向sha的指针,它使得文件的内容变为 ,因此删除该文件将删除该分支。 请注意,这将只有删除指针,而不是指针碰巧指向的实际提交 。

这个建议似乎安全的,但我偏执地认为存在一种情况,这种做法可能会失败或导致工作丢失。

除了删除master文件等明显错误的用户以外,这是否安全?

编辑:来自这个问题this question不同的,因为由于我们的内部工具的性质,往往--merged如果本地分支是无效的或不将不足以确定。另外,我们不希望一举删除分支......需要为每个分支手动检查以避免删除仍然活动的分支。

+1

根据我的理解,我不会因为这样做而失去工作。正如你所说,你只是删除了头像,但文件和提交仍然完好无损。最坏的情况,即使你删除了一个重要的分支头,你的reflog仍然应该在'.git/logs /'中完成。有可能是一个更好的,整洁/整洁的方法,不涉及手动删除文件。 – Chris

+0

可能重复的[如何删除所有已合并的git分支?](https://stackoverflow.com/questions/6127328/how-can-i-delete-all-git-branches-which-have-been -merged) – smarber

回答

2

一个缺陷是,如果引用都被“压缩”在过去,各种分支机构名称和相应的哈希ID将在.git/packed-refs而非或除了.git/refs/heads/之中。

如果在两个地方都出现名称,删除分支名称B.git/refs/heads/B只是显示旧的打包引用。如果仅在.git/packed-refs中,则不会有单独的文件要删除。

这也留下了陈旧的reflogs。这可能暂时是一个功能(如the comment by Chris),但请注意,reflog从不包含@{0}值,仅包含@{1}及更高值。

我强烈怀疑Git的某些未来版本将完全放弃每文件一个分支名称的技巧,因为它在Windows和MacOS文件系统上做出了案例折叠时发生的错误。使用git branch -Dgit update-ref -d(请注意,update-ref要求说明完整的参考名称)显​​然更好/更安全/更具前瞻性。

+0

关于reflog“@ {0}”值= D的有趣点 – Chris