2012-05-20 231 views
22

我试图从我的git存储库中拆分出一个子项目。 但不像 Detach (move) subdirectory into separate Git repository 我没有在它自己的子目录中(并将其移入并执行上述操作只会生成移动后的历史记录)。从git历史记录中删除已删除的文件

我克隆了一个分支,我想从中分支出子项目到它自己的存储库中,并删除了子项目没有使用的所有东西,所以基本上我可以使用它作为我的子项目的存储库。

现在我想摆脱不再存在于此存储库中的所有文件的历史记录,以便只保留文件的历史记录,以便将其存入后代。

我认为它必须能够使用Git滤波器分支,但我无法弄清楚如何

提前感谢

+0

另请参见[具有仅当前跟踪文件的复制历史记录的新回购](http://stackoverflow.com/questions/17901588/new-repo-with-copied-history-of-only-currently-tracked-files) 。 – 2013-07-27 22:11:01

回答

5

Here are some instructions to do what you want.

这将删除file_to_remove

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_to_remove' --prune-empty -- --all 
+19

事情是我想保留在工作目录中的文件和他们的历史记录,并让git忘记所有其他文件。首先找到所有被删除的文件并用上面的命令删除它们会非常麻烦,这就是为什么即使我发现它没有太多的用处 –

1

好吧,现在我正在尝试使用以下技术,如果它能正常工作,则会报告回来,因为它似乎很长时间: 在一个的zsh或bash在克隆库

git log --diff-filter=D --summary <start_commit>..HEAD | egrep -o '*[[:alnum:]]*(/[[:alnum:].]*)+$' > deleted.txt 

让所有被删除的文件

for del in `cat deleted.txt` 
do 
    git filter-branch --index-filter "git rm --cached --ignore-unmatch $del" --prune-empty -- --all 
    # The following seems to be necessary every time 
    # because otherwise git won't overwrite refs/original 
    git reset --hard 
    git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 
    git reflog expire --expire=now --all 
    git gc --aggressive --prune=now 
done; 

这可能都知道:dangeours为您的数据只能对克隆尝试。

+0

你最终发现了什么? –

+1

它运行得如此之慢的原因是因为你对每个文件运行'git filter-branch'命令***一次***以及一堆其他命令('git gc'不是一个廉价而快速的命令来运行)而不是运行它***一次所有文件***,所以它可能是非常低效的。请参阅[新回购,仅复制当前跟踪文件的历史记录](http://stackoverflow.com/questions/17901588/new-repo-with-copied-history-of-only-currently-tracked-files)。 – 2013-07-27 22:12:27

+0

将推送到github或gitlab清理远程存储库? –

相关问题