合并执行rm的提交--cached

时间:2014-01-03 22:12:48

标签: git merge

我为WordPress项目创建了一个git存储库,许多提交后来意识到我只需要一些插件和主题目录。我想从repo中排除所有其他文件。

我知道我可以从repo中删除文件,但是将它们保存在git rm --cached的工作目录中。我试过了,但我不知道如何将该提交合并到其他分支而不会丢失合并中的文件。

  1. 如何在不丢失文件的情况下合并删除?
  2. 如果我查看较旧的提交然后再次结帐HEAD会怎样?
  3. 或者有其他方法可以删除我没想到的文件吗?

2 个答案:

答案 0 :(得分:3)

首先,我建议备份存储库,以避免错误。一个简单的cp -r就足够了。如果您没有足够的驱动器空间,请运行git branch -av > branch_refs,以便在出现任何问题时,如果出现任何问题,您可以使用git reset轻松恢复分支,而无需深入.git文件夹。

现在为了避免问题#2(检查旧提交)的问题,我建议使用filter-branch。请注意,它会重新编写您的历史记录,因此如果您的作品已发布(push),这通常不是一个好主意。
首先,删除文件,使它们当前未被跟踪(否则您将丢失其内容):

git rm --cached <file(s)>
git commit -m"removed tracking of unneeded files"

<file(s)>替换为您要删除的文件。
现在文件未跟踪,请对要删除的文件运行以下命令(如上所述替换<file(s)>):

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch <file(s)>' -- --all

现在你应该在头部有一个空提交(“删除跟踪...”一个)。删除它:

git reset --soft HEAD^

对于整个回购,应该这样做。

这直接来自filter-branch

的手册页
   Suppose you want to remove a file (containing confidential information
   or copyright violation) from all commits:

       git filter-branch --tree-filter 'rm filename' HEAD

   However, if the file is absent from the tree of some commit, a simple
   rm filename will fail for that tree and commit. Thus you may instead
   want to use rm -f filename as the script.

   Using --index-filter with git rm yields a significantly faster version.
   Like with using rm filename, git rm --cached filename will fail if the
   file is absent from the tree of a commit. If you want to "completely
   forget" a file, it does not matter when it entered history, so we also
   add --ignore-unmatch:

       git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

   Now, you will get the rewritten history saved in HEAD.

答案 1 :(得分:0)

另一个选择是在每个分支中重复git rm --cached操作,然后在完成后更新它们。