我为WordPress项目创建了一个git存储库,许多提交后来意识到我只需要一些插件和主题目录。我想从repo中排除所有其他文件。
我知道我可以从repo中删除文件,但是将它们保存在git rm --cached
的工作目录中。我试过了,但我不知道如何将该提交合并到其他分支而不会丢失合并中的文件。
答案 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
操作,然后在完成后更新它们。