Git忽略&改变过去

时间:2011-07-22 19:52:46

标签: git gitignore

我最近才添加了.gitignore文件来忽略我的子目录中的某些特定数据文件。我真的喜欢回到过去,并将它们从以前的提交/历史中删除。

这很容易实现吗?我应该从哪里开始?如何开始?

5 个答案:

答案 0 :(得分:9)

这将是一个两步程序:

介绍.gitignore文件

为此,早​​期提交必须包含.gitignore文件。所以,你需要:

  1. 查看根提交:git checkout -b temp $(git rev-list HEAD | tail -1)
  2. 添加.gitignore文件。
  3. git commit --amend
  4. 将所有现有分支重新定位到“temp”。这可能会或可能不会无缝地工作,因此如果出现任何冲突,您可能需要摆弄它。
  5. 检查您的工作分支并删除临时分支。
  6. 重写历史

    现在,您可以通过此命令自动从所有分支中删除这些文件:

    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

http://progit.org/book/ch6-4.html

答案 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来减少脚本的输出,但是如果您想查看整个过程,可以放心地删除它。