我最近才添加了.gitignore
文件来忽略我的子目录中的某些特定数据文件。我真的喜欢回到过去,并将它们从以前的提交/历史中删除。
这很容易实现吗?我应该从哪里开始?如何开始?
答案 0 :(得分:9)
这将是一个两步程序:
为此,早期提交必须包含.gitignore
文件。所以,你需要:
git checkout -b temp $(git rev-list HEAD | tail -1)
.gitignore
文件。git commit --amend
现在,您可以通过此命令自动从所有分支中删除这些文件:
git filter-branch --tree-filter 'git clean -f -X' -- --all
这将重写所有分支以删除被忽略的文件。可能需要一段时间,具体取决于您的存储库的大小。
答案 1 :(得分:1)
请参阅removing file from every commit部分。这正是你的情况。
但要小心,因为每个历史重写的功能都会改变每次提交。因此,如果您拥有公共存储库并且有人可以根据它进行一些工作 - 那么就会导致问题。
答案 2 :(得分:0)
使用filter-branch
git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
答案 3 :(得分:0)
git filter-branch是一种可能的解决方案。在使用它之前,请确保您了解其含义,因为更改是永久性的。您将无法轻松地将已过滤的分支与旧分支合并。
git filter-branch --index-filter'git rm --cached --ignore-unmatch filename'HEAD
交换您想要去的特定文件的文件名。
答案 4 :(得分:0)
我刚刚完成了此操作,其他一些answers / comments几乎把我带到了那里,但是我必须进行一些更改。
我已经使用filter-branch
在历史开始时介绍了我的.gitignore
文件,并将其应用于所有以前的提交。
这是命令:
git filter-branch --tree-filter 'git rm --cached -rf . >/dev/null ; cp ~/Desktop/new-gitignore .gitignore ; git add . ; git clean -d -X -f >/dev/null' -- --all
如您所见,它假设您在桌面(.gitignore
)上有想要的~/Desktop/new-gitignore
文件的副本。
我发现,只有删除并重新添加(git rm ...
,git add .
)后,所有文件git clean
才会删除所有新.gitignore
的文件。告诉它忽略。请注意,清理后不必再次添加文件,因为tree-filter
只会按原样提交所有文件。
我添加了>/dev/null
来减少脚本的输出,但是如果您想查看整个过程,可以放心地删除它。