[英]Git ignore all files except particular ones
我在目錄中有很多文件,我不希望它們被git跟蹤。 所以我想忽略除.bashrc
, .gitignore
和.config/terminator/config
之外的所有文件。
我正試圖在.gitignore中做這樣的事情:
*
!.gitignore
!.bashrc
!.config/terminator/config
.bashrc
和.gitignore
文件現在沒有簽名但仍無法獲得.config/terminator/config
unignored。 我怎么能用git做到這一點?
我有一個可能的解決方案但更優雅的一個沒有指定子目錄?
*
!.gitignore
!.bashrc
!.gitconfig
!.config/
!.config/terminator/
!.config/terminator/config
答案的短版是一旦混帳忽略了一些目錄 ,它前進不費心去找這個目錄中 ,除非別的東西已經迫使它這樣做。 1要停止這一點,你必須明確列出目錄,或者你不想忽視,使用目錄!
項:
*
!/.bashrc
!/.config
!.config/terminator
!.config/terminator/config
!/.gitignore
那是:
*
告訴Git: 除非被覆蓋,否則忽略一切 。 然后最終:
!.bashrc
覆蓋.bashrc
的忽略規則,依此類推。 但Git所做的是它從閱讀開始.
找到所有條目。 假設它按字母順序找到它們: .bashrc
, .config
, .editorthing
, .gitignore
, .history
等等; 並假設我們有你原來的.gitignore
文件:
.bashrc
,讓我們檢查一下......啊,第1行說忽略但是3說沒有,所以不要忽視。 結果:不予理睬。 .config
,讓我們檢查一下。 第1行表示忽略,第2行表示.gitignore
,第3行表示.bashrc
,第4行表示保留.config/terminator/config
。 這不是任何一個,所以第1行適用! 結果:忽略了! 可以說,步驟2中的操作是愚蠢的:如果忽略較短的.config
則顯然不可能應用長規則,因此.config/<something>
的存在應該是未被忽略的,應該觸發Git取消忽略.config
。 事實上,最新版本的Git試圖對此更加聰明,但是舊版本沒有:你必須明確地忽略.config
(或/.config
,這里更好,因為我不會進入,但這就是為什么我在上面那樣寫的2 )。
還有一個更優雅的伎倆,但它造成的Git要慢得多,所以你可能不希望使用它。 訣竅是顯式取消忽略所有目錄:
*
!*/
!/.bashrc
等等。 但是現在,如果你有一個目錄, a
數以百萬計的子目錄和文件的a
,Git會掃描所有a
和所有的子目錄,而在此之前,它會跳過它。
1 索引中包含.config
中的文件會強制Git掃描.config
。 但是,您將遇到與.config/terminator
相同的問題,除非索引包含.config/terminator
中的文件。
2好的,我會稍微介紹一下。 它不適用於這種特殊情況,但假設你是在忽略.bashrc
,如果Git由於某種原因掃描a/
,並且a/
包含一個名為.bashrc
的文件,Git就不會忽略a/.bashrc
。 但是,我們不需要.config/terminator
上的前導斜杠,因為它包含一個嵌入的斜杠(一個不在末尾)。 這使得該名稱上的匹配成為根,而.bashrc
上的匹配是非root的,因此匹配a/.bashrc
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.