[英]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
然而,這將匹配排除任何名為bin
或obj
文件,這不太可能是一個問題,除非它是什么時候。 以下解決了這個問題(是的,在這種情況下正斜杠工作):
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/
類的東西可能不起作用,如果你有一個鋸齒狀的項目層次結構,在樹下面有一些obj
和bin
目錄。
這是快速測試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沒有忽略名為obj
和bin
文件,但在運行此腳本后忽略了層次結構中的obj
和bin
目錄:
#!/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.