在Git中删除单个文件的版本历史记录

时间:2013-11-18 13:45:40

标签: git version-control git-clone

用例:

我正在创建我的存储库的克隆,我希望保留每个其他文件的版本历史记录,但我可以将其命名为“black-sheep.json”


以下是我发现的唯一方法:

  1. 创建black-sheep.json的临时副本,比如说tmp.json
  2. 然后使用此命令
  3. 删除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

    我不喜欢这个解决方案!还有更好的方法吗?


    我刚刚意识到另一种方法,我可以将这个特定文件的所有提交压缩成一个提交。

    然而,在这种方法中,我有以下疑问

    • 如何在非交互模式下执行此操作?
    • 如何跨多个非顺序提交执行此操作?

    注意:

    • 所有提交仅包含一个文件。
    • 我需要在代码中实现它。

2 个答案:

答案 0 :(得分:1)

  

1 /如何在非交互模式下执行此操作?

我所知道的唯一解决方案是使用git rebase --interactive --autosquash,但它基于相同的提交消息:如果您没有这些消息,则需要:

  • 首先,rebase --interactive以编辑这些消息
  • 第二,使用autosquash

但这会毁掉这个过程的“非互动”部分。

  

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的历史)