用例:
我正在创建我的存储库的克隆,我希望保留每个其他文件的版本历史记录,但我可以将其命名为“black-sheep.json”
以下是我发现的唯一方法:
git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch black-sheep.json' \ --prune-empty --tag-name-filter cat -- --all
0.3。最后将tmp.json重命名为black-sheep.json
我不喜欢这个解决方案!还有更好的方法吗?
我刚刚意识到另一种方法,我可以将这个特定文件的所有提交压缩成一个提交。
然而,在这种方法中,我有以下疑问
注意:
答案 0 :(得分:1)
1 /如何在非交互模式下执行此操作?
我所知道的唯一解决方案是使用git rebase --interactive --autosquash
,但它基于相同的提交消息:如果您没有这些消息,则需要:
rebase --interactive
以编辑这些消息但这会毁掉这个过程的“非互动”部分。
2 /如何在多个非顺序提交中执行此操作?
这就是autosquash
的作用,但在我看来,git filter-branch
仍然是在 one (非交互式)步骤中执行所需操作的全面精确工具。
如果您不喜欢git filter-branch
命令的语法,则另一个工具可能是BFG Repo-Cleaner。
答案 1 :(得分:1)
JGit确实提供了用于执行交互式rebase的API。
但我决定保持简单,并重命名该文件,以便在每次克隆存储库时附加一个新的版本号。
新版本中的 back-sheep_revA.json 变为 的黑sheep_revB.json 强>
删除black-sheep_revA.json
这不是一个非常精致的方法,但它保持低复杂性并完成工作(删除black-sheep.json的历史)