2016-06-13 136 views
0

这是一个非常不寻常的用例,但我想从git repo中删除所有跟踪的文件。是的,跟踪的文件,而不是未跟踪的文件。git clean只跟踪文件

我有一大套代码生成文件,其中一些二进制文本文件。我希望能够跟踪文本生成文件的历史记录。我有忽略列表设置等。问题是,我下次运行生成过程时,它会更改所需的文件,添加新的文件,但它不会删除不再生成的旧文件。删除整个工作树会做,但它也会删除已经存在的二进制文件和其他文件,我不想那样做。

如果我有选择使用git来只清理被跟踪的文件将是最好的使用已经准备好的复杂.gitignore文件来区分这些文件,但我没有看到文档中的任何内容。

是否有棘手或没有选项如何从工作树中删除所有跟踪的文件。

回答

1

如果你想删除的master分支版本控制下的所有文件,那么你可以尝试:

git ls-tree -r -z master --name-only | xargs -0 git rm 

命令的第一部分管道递归发现这些版本在master所有文件之前,和git rm从远程存储库中删除每一个。

git rm <file>删除远程存储库跟踪的文件。

+1

我相信你在选择想'-z'为'git的LS-tree'这里。使用'HEAD'来引用当前提交。使用'git ls-files'来处理当前索引。 – torek

+0

我一直在寻找删除版本控制中已经可以跟踪的所有文件,但是这样做,谢谢 – gsf

+0

当然,我只是在测试它 – gsf

0

您可以合并空树与树的工作更新:

git read-tree -m -u $(git mktree < /dev/null) 
+0

你甚至不需要运行'git mktree',因为[空树总是包含在每个存储库](http://stackoverflow.com/questions/9765453/is-gits-semi-secret-empty-tree-object-reliable-and-why-is-there-not-a -symbolic)。我仍然推荐使用'git hash-object -w -t tree torek

+0

...或者,当然,你的答案是'git mktree':'hash = $(git mktree torek

+0

@torek我用你的建议更新我的答案。 – PetSerAl