2016-06-13 138 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