簡體   English   中英

Git:如何忽略子目錄中的匹配目錄?

[英]Git: How do I ignore matching directories in a sub directory?

我有一個具有以下結構的項目:

/.
  /src
    /project1
      /bin
      /obj
    /project2
      /bin
      /obj
  /tools
    /tool1
      /bin 

我可以添加到.git / info / exclude中以忽略“src”下的所有bin / obj目錄? 我不想明確指定每個項目名稱。

嘗試將這些行添加到.gitignore文件中:

src/*/bin
src/*/obj

接受的答案對我不起作用。

> git --version
git version 1.7.0.2.msysgit.0

似乎正斜杠不能與.gitignore文件中的msysgit一起使用。 這有效。

*\bin
*\obj

然而,這將匹配排除任何名為binobj文件,這不太可能是一個問題,除非它是什么時候。 以下解決了這個問題(是的,在這種情況下正斜杠工作):

bin/
obj/
*.user
*.suo

這將匹配放置.gitignore文件的文件夾下的層次結構中不同深度的文件。 請注意,當我為特定子文件夾包含前綴時,上述操作無效,因此我將其直接放在我的Source文件夾中。

作為Visual Studio用戶(可能是OP來自bin / obj引用),排除.user.suo文件也很不錯。


gitignore規范

模式具有以下格式:

  • 空行不匹配任何文件,因此它可以作為可讀性的分隔符。

  • 以#開頭的行作為注釋。

  • 一個可選的前綴! 否定了這種模式; 之前模式排除的任何匹配文件將再次包含在內。 如果否定模式匹配,則將覆蓋較低優先級模式源。

  • 如果模式以斜杠結尾,則為了以下描述的目的將其刪除,但它只會找到與目錄的匹配項。 換句話說,foo /將匹配目錄foo和它下面的路徑,但是不匹配常規文件或符號鏈接foo(這與pathpec在git中的工作方式一致)。

  • 如果模式不包含斜杠/,git將其視為shell glob模式,並檢查相對於.gitignore文件位置的路徑名的匹配(相對於工作樹的頂層,如果不是來自.gitignore)文件)。

  • 否則,git將模式視為適合fnmatch(3)使用FNM_PATHNAME標志的shell glob:模式中的通配符與路徑名中的/不匹配。 例如,“Documentation / * .html”匹配“Documentation / git.html”,但不匹配“Documentation / ppc / ppc.html”或“tools / perf / Documentation / perf.html”。

  • 前導斜杠與路徑名的開頭匹配。 例如,“/ *。c”匹配“cat-file.c”但不匹配“mozilla-sha1 / sha1.c”。

最明顯的方法是將這些添加到src/.gitignore

obj/
bin/

這會忽略目錄調用obj中的所有路徑,或者從src目錄向下忽略名為bin的目錄。

頂級.gitignore中的src/*/obj/類的東西可能不起作用,如果你有一個鋸齒狀的項目層次結構,在樹下面有一些objbin目錄。

這是快速測試shell腳本,顯示了操作中的忽略規則:

#!/bin/sh
mkdir src
mkdir tools

mkdir src/project1
mkdir src/project2
mkdir tools/tool1

mkdir src/project1/bin
mkdir src/project1/obj
mkdir src/project2/bin
mkdir src/project2/obj
mkdir tools/tool1/bin

touch testfile
touch src/testfile
touch tools/testfile
touch src/project1/testfile
touch src/project2/testfile
touch tools/tool1/testfile
touch src/project1/bin/testfile
touch src/project1/obj/testfile
touch src/project2/bin/testfile
touch src/project2/obj/testfile
touch tools/tool1/bin/testfile

git init

add_empty() { touch "$1" && git add "$1"; }

add_empty dummy
add_empty src/dummy
add_empty tools/dummy
add_empty src/project1/dummy
add_empty src/project2/dummy
add_empty tools/tool1/dummy

git status

printf 'obj/\nbin/\n' >src/.gitignore && git add src/.gitignore

git status

第一個狀態的未跟蹤文件部分是:

# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       src/project1/bin/
#       src/project1/obj/
#       src/project1/testfile
#       src/project2/bin/
#       src/project2/obj/
#       src/project2/testfile
#       src/testfile
#       testfile
#       tools/testfile
#       tools/tool1/bin/
#       tools/tool1/testfile

添加.gitignore文件后:

# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       src/project1/testfile
#       src/project2/testfile
#       src/testfile
#       testfile
#       tools/testfile
#       tools/tool1/bin/
#       tools/tool1/testfile

作為一個測試來證明git沒有忽略名為objbin文件,但在運行此腳本后忽略了層次結構中的objbin目錄:

#!/bin/sh
mkdir src/project3
touch src/project3/testfile && git add src/project3/testfile
touch src/project3/obj
touch src/project3/bin

mkdir src/subdir
mkdir src/subdir/proj
touch src/subdir/proj/testfile && git add src/subdir/proj/testfile
mkdir src/subdir/proj/obj
mkdir src/subdir/proj/bin
touch src/subdir/proj/obj/testfile
touch src/subdir/proj/bin/testfile

新的未跟蹤文件是:

# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       src/project1/testfile
#       src/project2/testfile
#       src/project3/bin
#       src/project3/obj
#       src/testfile
#       testfile
#       tools/testfile
#       tools/tool1/bin/
#       tools/tool1/testfile

令我感到困惑的是,無論你添加了什么掩碼,除非強行刪除,否則文件將保留在存儲庫中,因此添加了原始的,已編譯的可視化工作室解決方案,我必須清理存儲庫發布:

git rm --cached */obj/*
git rm --cached */lib/*
git rm --cached *.user
git rm --cached *.suo
git rm --cached *ReSharper

然后,將其添加到.gitignore:

*/*/bin
*/*/obj
*.user
*.suo
*ReSharper*

然后承諾:

git add .
git commit -m "removed user files and binaries from repository"

我相信你應該能夠添加

src/*/bin/*

到.gitignore,以及與該模式匹配的任何內容都將被忽略。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM