2014-01-09 11 views
2

我遇到了git clean問題,排除了嵌套dirs的選項。Git clean不包括嵌套的子目錄

我想清除所有未提交的文件,不包括vendor/bundle dir。 我的測試回購loks,如:

debugg-dir/ 
    .git/ 
    file.txt 
    not-commited-file 
    not-commited-folder 
     another-not-commited-file 
    vendor/ 
    bundle/ 
     another-not-commited-file 

重現測試回購有:

git init debugg-dir && cd debugg-dir 
touch file.txt && g a . && git ci -m "Commit" 
mkdir -p not-commited-folder && touch not-commited-folder/another-not-commited-file 
mkdir -p vendor/bundle && touch vendor/bundle/another-not-commited-file && touch not-commited-file 

的Git clean命令:

git clean -d -x -n -e vendor/bundle 

預計將有清潔後:

debugg-dir/ 
    .git/ 
    file.txt 
    vendor/ 
    bundle/ 
     another-not-commited-file 

是有任何正確的方法來從git clean命令中排除嵌套的目錄?

#編輯:

說明:

沒有針對此情況不 「乾淨」 的解決方案。 Git clean不包括與git clean -d -x -n -e dir_name dirs,但這不適用於嵌套dirs。 git中的這個bug還是有一些很好的理由呢?更多信息爲什麼這不起作用,你可以找到in source。長話短說,排除模式只適用於字符串,直到模式中的第一個'/'。

我的解決辦法:

cd vendor && git clean -dxf -e bundle && cd .. 
git clean -dxf -e vendor 

有了這個,我設法只保留嵌套的目錄和它的內容。

回答

1

git clean --help

混帳乾淨 - 從工作樹移除未跟蹤文件

如果您添加到這個弗洛伊德Pink的解釋有關-d(不久,選項可以同時刪除未跟蹤目錄,而不僅僅是文件),那麼這就是爲什麼你刪除了vendor。現在
據說要刪除僅not-commited-file(所以,無論任何未經跟蹤目錄也不another-not-commited-file我想你應該git clean交互模式,所以

git clean -i 

它會問你什麼,每個未跟蹤做文件(僅限文件,如果您還想要查找目錄,請添加-d)。

編輯 OP的問題編輯後:你想太刪除目錄,所以運行

git clean -i -d 

編輯2:自-e意義從手動不清楚我,我GOOGLE了它並發現this。我建議您閱讀的談話,因爲它解釋了-e真正的意義是不是OP打算如何它(或者可以從說明書可以理解)

編輯3,更多-e開關。繼我在編輯2發現的鏈接後,我決定嘗試一下。這裏的結果,我希望能幫助你瞭解-e。的.gitignore
內容,所以我不要犯臨時文件:

*.tmp 

我發出的命令:

echo "Temporary file" > sample.tmp 
git st //which of course shows *nothing to commit, working directory clean* 
git clean -fX -e \!sample.tmp 

其結果是,與TMP擴展名的文件被(由於-X)刪除但是sample.tmp。所以,最後,什麼-e確實,在我的理解,並請糾正我,如果在我說錯了,是不是可以從清洗過程中排除的模式,但

從清潔的規則排除模式(以我的情況下,規則是刪除所有.tmp文件,我從中手動排除了sample.tmp)。

+0

'git clean'沒有交互模式。可以? –

+0

它有。試試看(或者閱讀'git clean --help')。免責聲明:在我的筆記本電腦上,'git --version'顯示'git version 1.8。5',它可能不存在於早期版本 – ThanksForAllTheFish

+0

看不見[這裏](https://www.kernel.org/pub/software/scm/git/docs/git-clean.html),但更多官方的[這裏](http://git-scm.com/docs/git-clean)確實有'-i'開關。 –

1

這是因爲vendor是一個未跟蹤的目錄,您正在使用選項- d

由於the manual說:

-d

除了未跟蹤文件中刪除未跟蹤目錄。如果未跟蹤的目錄由不同的git存儲庫管理,則默認情況下它不會被刪除。如果您真的想刪除這樣的目錄,請使用-f選項兩次。

我能得到使用此命令所需的輸出:

git clean -x -n 

是否在真實場景中的工作?如果沒有,你可能想在vendor/bundle內提交一些其他文件,然後看看。

+0

什麼是情況,當有未跟蹤的目錄例如。在項目的根源,如何清理呢? – rastasheep

+0

你想探索'-X'而不是'-x'選項嗎?這允許只清除那些在'.gitignore'中指出的文件 - [閱讀更多](https://www.kernel.org/pub/software/scm/git/docs/git-clean.html) –

+0

我可以不依靠.gitignore,我需要更通用的解決方案。 更新的問題,現在更加實際。 – rastasheep