使用新的.gitattributes文件迁移Git-LFS

时间:2019-09-30 07:38:03

标签: git git-lfs

我有一个稍大的(32k commits)git存储库,在该存储库中,我需要重写一个分支中的历史记录,以删除一堆.gitattributes文件所描述的大文件。该分支完全是本地分支,从未访问过远程服务器(实际上,由于历史记录较大,我们的远程服务器拒绝了它)。

我知道以下命令将遍历分支的历史记录并删除所有.dll文件:

$ git lfs migrate import --include='*.dll'

但是由于.gitattributes文件存在且范围很广,如果创建分支时.gitattributes文件已经存在,那么是否有一条命令可以简单地重播为指针化这些文件所做的工作?

1 个答案:

答案 0 :(得分:2)

我首先将正确的.gitattributes插入分支的开头(例如,使用git rebase):

*--*--x--*--*--*--*--* <- master
       \
        *--*--*--*--*--*--a--* <- my/branch
                          ^
                          commit with updated .gitattributes

# with the commits identified as above, from branch my/branch, run :
$ git rebase -i x
   ...
   # in the opened editor, move commit 'a' at the beginning of the list
   # save & close

# you should obtain :
*--*--x--*--*--*--*--* <- master
       \
        a'--*--*--*--*--*--*--* <- my/branch (rewritten)
        ^
      rewritten commit

之后:

您可以使用git filter-branch --tree-filter让git依次重播提交,并应用.gitattributes中描述的过滤器:

# first arg is the name of a script to execute on each commit
#   you have nothing to edit : just use 'true' as an action
#   the only action you expect is that git applies the filters
#   when re-staging files for each individual commit

git filter-branch --tree-filter true a'..my/branch

您可能想要添加--prune-empty选项,或者您可以在重写后删除空的提交,例如再次使用git rebase -i