2012-07-18 64 views
88

有沒有一種方便的方法來忽略git倉庫中所有未跟蹤的文件和文件夾?
(我知道關於.gitignore。)git:如何忽略所有目前未追蹤的文件?

所以git status會再次提供一個乾淨的結果。

+3

使用'-uno'標誌。 – nhahtdh 2012-07-18 13:39:14

+0

[有沒有辦法讓git不顯示未跟蹤文件?](http://stackoverflow.com/questions/2774416/is-there-a-way-to-get-git-not-to -show-the-untracked-files) – random 2012-07-28 04:48:07

+0

或者你可能想添加一個*到你的.gitignore文件。 :) – vilicvane 2013-08-07 07:38:04

回答

202

正如前面已經說過,從狀態只排除使用:

git status -uno # must be "-uno" , not "-u no" 

如果你不是想永久不理你能目前未跟蹤的文件,從您項目的根源,發佈:

git status --porcelain | grep '^??' | cut -c4- >> .gitignore 

之後每次調用git status都會明確忽略這些文件。

UPDATE:上述命令有一個小缺點:如果你還沒有.gitignore文件,你的gitignore會忽略它自己!發生這種情況是因爲在執行git status --porcelain之前創建了文件.gitignore。所以,如果你沒有一個.gitignore文件但我建議使用:

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore 

這將創建完成創建.gitignore文件前子shell。

命令解釋,因爲我得到了很多選票(謝謝!)我想我最好解釋的命令一下:

  • git status --porcelain使用的git status --short因爲manual狀態改爲「爲腳本提供易於解析的格式輸出,這與短輸出類似,但在git版本中保持穩定並且不管用戶配置如何。「因此,我們有兩個parseability和穩定性;
  • grep '^??'濾波器僅開始的行??,其中,根據所述git status manual,對應於未跟蹤文件;
  • cut -c4-移除每一行,這使的前3個字符我們只是相對路徑未跟蹤文件;
  • |符號pipes,其前一個命令的輸出傳遞到下面的命令的輸入;
  • >>>符號redirect operators,其附加的輸出的公關evious命令分別覆蓋/創建一個新文件。

另一種變體爲那些喜歡誰using sed代替grepcut,還有一種方法:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore 
+1

如果我沒有達到我的f#$%投票限制,我肯定會++這個。 – sjas 2013-02-28 18:36:45

+2

'cut -c4-'**刪除每行的前4個字符,這給我們提供了未跟蹤文件的相對路徑; **號'-c'標記要刪除的列號列表的開始。並且'4-'*選擇*從第4列到結尾的行,從而切換第1-3列。所以你的cut命令實際上會刪除每行的前3個字符。如果你從一個git狀態行中刪除了4個字符,例如這裏的這個文件:'? app/views/static_pages/contact.html.erb',你會刪除'app'的第一個字母。所以命令是正確的,但解釋是錯誤的。 – 7stud 2014-09-10 21:03:46

+0

@ 7stud:謝謝你,你說的對,我寫錯了4。我已經解決了答案。 – Diego 2014-09-11 10:17:43

2

兩種方式:

將參數「-uno」用於git-status。這裏有一個例子:

[[email protected]_vmware:ft]$ git status 
# On branch ft 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
#  foo 
nothing added to commit but untracked files present (use "git add" to track) 
[[email protected]_vmware:ft]$ git status -uno 
# On branch ft 
nothing to commit (working directory clean) 

或者,您可以添加文件和directires到的.gitignore,在這種情況下,他們將永遠不會出現。

+2

編輯「.gitignore」作爲'git status |貓>> temp && vim temp'。然後編輯該文件,以便刪除前幾行和最後一行,並在後面追加'#'和空格。然後'cat temp >> .gitignore && rm temp'。如果以前沒有'.gitignore','mv temp .gitignore'會做。醜陋的東西,但比手動更新'.gitignore'更好。 – sjas 2012-07-18 13:53:34

+1

這個答案不正確。正確答案是'-uno'。如果使用'-u no',它相當於'no -u' - 它會在名爲'no'(可能不存在)的文件上執行一個狀態並使用默認的'-u'模式。即它相當於'git status no' – 2016-03-01 10:50:56

10

發現它在the manual

git status -uno

+29

那麼如果每個人都會在發佈前RTFM,我們都不會得到任何代表:-) – 2012-07-18 13:43:15

+4

但是這篇文章沒有回答這個問題。 RTQ似乎更合適。 – 2014-02-19 18:33:04

+1

@ Sridhar-Sarnobat我的回答回答了我的問題,所以我不明白你想告訴的是什麼? – sjas 2015-04-30 11:39:09

1

如果你有很多未跟蹤文件,並且不希望「 gitignore「所有這些,請注意,因爲git 1.8.3 (April, 22d 2013)git status會提及--untracked-files=no,即使您並未在第一位添加該選項!

git status」建議用戶在需要太長時間時使用--untracked=no選項進行調查。

4

-u no也不顯示未保存的文件。 -uno按需要工作並顯示未分離,但隱藏未跟蹤。

+0

即使這樣也不完全正確。 'git status -u X'等同於'git status X -u'('X'不是'-u'的參數)。這又相當於'git status X'(因爲沒有參數的'-u'是默認的'-u')。因此,它只是文件'X'上的git-status。所以,如果'X'是'no',它只會嘗試在名爲'no'的文件上執行git status,您可能沒有該文件 – 2016-03-01 10:53:24

31

如果要永久忽略這些文件,一個簡單的方法將它們添加到.gitignore

git ls-files --others --exclude-standard >> .gitignore 
+3

爲什麼這不會得到多少票?無需通過其他2個程序! – JoelFan 2017-01-04 21:56:02

+3

@JoelFan:兩個理由: 1)**這個只從git的根目錄開始工作,而接受的從每個子目錄開始工作,你只需要調整目標'.gitignore'路徑 2)if你有一個未被跟蹤的目錄,**這個列表中的每一個單獨的文件,而不是未跟蹤的目錄本身**(所以你不會忽略該目錄,因此仍然可以在未被跟蹤的目錄中報告未來的文件,而接受的只列出目錄,而不是內部未跟蹤的文件,這是你想要做的事情,但通常你只是想忽略整個目錄 – Diego 2017-06-30 13:50:36

+1

謝謝Poolie我欣賞你的建議的不同之處* *因爲@Diego提到的幾點我開始使用文件和文件夾庫,我不想跟蹤/推送原始文件,我只想跟蹤我在庫中添加或重建的文件。 PA租文件夾將忽略所有內容。這/你的解決方案快速添加所有1696個文件。的xD – Chaos7703 2017-07-30 02:58:51

相關問題