git - 删除分支 -> 安全地编辑 .git/refs/heads 中的文件?

标签 git branch

我们团队使用的自定义 Git 工具会为处理的每个新功能/错误创建一个分支。

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

经常出现的一个问题是如何清理留在开发人员本地存储库中的所有陈旧分支。需要一个快捷方式,因为当有许多这样的陈旧分支时,键入许多 git branch -D branchname 可能会很烦人。

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

这是我发出的全文:

One manual trick to quickly delete branches in batch is to delete files from your .git/refs/heads folder. You will see filenames that correspond to branches. A branch is just a pointer to a sha that makes up the file's content, so deleting the file will delete the branch. Note that this will only delete the pointer, not the actual commit that the pointer happened to be pointing to.

这个建议似乎是安全的,但我担心这种方法在某些情况下可能会失败或导致工作丢失。

除了用户犯了明显的错误(例如删除 master 文件)之外,这是安全的建议吗?

编辑:这个问题不同于this question因为由于我们内部工具的性质,通常 --merged 不足以确定本地分支是否过时。此外,我们不想一次性删除分支...需要对每个分支进行手动检查,以避免删除仍处于事件状态的分支。

最佳答案

一个陷阱是,如果引用过去被“打包”过,各种分支名称和对应的哈希ID将在.git/packed-refs中。而不是或除了.git/refs/heads/ .

如果一个名称出现在两个地方,删除分支名称​​ B 来自 .git/refs/heads/<em>B</em>简单地揭示了旧的打包引用。如果只在.git/packed-refs不会有单独的文件要删除。

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

我强烈怀疑 Git 的某些 future 版本将完全放弃每个分支名称一个文件的技巧,因为它在进行大小写折叠的 Windows 和 MacOS 文件系统上非常失败。使用 git branch -D 显然更好/更安全/更面向 future 或 git update-ref -d (注意 update-ref 需要拼出完整的引用名称)。

关于git - 删除分支 -> 安全地编辑 .git/refs/heads 中的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45549401/

相关文章:

svn - 提交到 SVN 分支也会影响主干

git - Jenkins - 一个版本有多少 CI/CD 管道?

javascript - 如何在 git 中接受他们的更改

Git分支/merge 策略: release + hotfix branches, master有什么意义

git - 我可以为本地分支定义多个上游分支吗?

svn - 如何使用 TortoiseSVN 进行分支和合并?

svn - fork 开源项目的最佳实践是什么?

git - 从父模块的 .git 将预提交 Hook 添加到子模块

git - .git/config 和 .gitmodules 不同步

wordpress - 轻松移动环境:deploybot,docker还是手动grunt/gulp设置?