ディレクトリ内のファイルを無視するための.gitignore
ファイルの正しい構文は何ですか?
それでしょうか
config/databases.yml
cache/*
log/*
data/sql/*
lib/filter/base/*
lib/form/base/*
lib/model/map/*
lib/model/om/*
または
/config/databases.yml
/cache/*
/log/*
/data/sql/*
/lib/filter/base/*
/lib/form/base/*
/lib/model/map/*
/lib/model/om/*
?
パターンフォーマット
空白行はファイルと一致しないため、読みやすくするための区切り文字として使用できます。
#
で始まる行はコメントとして機能します。
パターンを無効にするオプションの接頭辞!
。前のパターンで除外された一致ファイルはすべて再び含まれます。否定パターンが一致すると、優先順位の低いパターンのソースが上書きされます。
パターンがスラッシュで終わっているなら、それは以下の説明の目的のために削除されます、しかしそれはディレクトリとの一致を見つけるだけでしょう。言い換えれば、foo/
はディレクトリfoo
とその下のパスには一致しますが、通常のファイルやシンボリックリンクfoo
には一致しません(これは、gitでのpathspecの一般的な動作方法と一致します)。
パターンにスラッシュ/
が含まれていない場合、gitはそれをシェルglobパターンとして扱い、.gitignore
ファイルの場所を基準とした相対パス(.gitignore
ファイル以外の場合は作業ツリーの最上位レベルに対する相対パス)と照合します。 。
それ以外の場合、gitはパターンをFNM_PATHNAME
フラグを指定したfnmatch(3)
による消費に適したシェルグロブとして扱います。パターン内のワイルドカードは、パス名内の/
と一致しません。たとえば、Documentation/*.html
はDocumentation/git.html
と一致しますが、Documentation/ppc/ppc.html
またはtools/perf/Documentation/perf.html
とは一致しません。
先頭のスラッシュはパス名の先頭に一致します。たとえば、/*.c
はcat-file.c
と一致しますが、mozilla-sha1/sha1.c
とは一致しません。
git help gitignore
またはman gitignore
それは前者でしょう。フォルダ構造ではなく拡張子でも移動します。
すなわち私の例のC#開発はファイルを無視します:
#OS junk files
[Tt]humbs.db
*.DS_Store
#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad
#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*
#Project files
[Bb]uild/
#Subversion files
.svn
# Office Temp Files
~$*
更新
以下のコメントから最新情報を提供したいと思いました。 OPの質問に直接回答するわけではありませんが、.gitignore
構文のその他の例については、以下を参照してください。
コミュニティウィキ(常に更新されています):
Visual Studioプロジェクトおよびソリューションの場合は.gitignore
特定の言語での使用例はここにあります(Chris McKnightのコメントのおかげで)。
スラッシュを含むパスは、.gitignoreファイルを含むディレクトリからの相対パスと見なされます。通常はリポジトリの最上位レベルですが、サブディレクトリに配置することもできます。
したがって、あなたが与えるすべての例で、パスはスラッシュを含むので、2つのバージョンは同一です。先頭にスラッシュを付ける必要があるのは、パスに が 1でない場合だけです。たとえば、リポジトリのトップレベルでのみfooを無視するには、/foo
を使用します。 foo
を書くだけでは、リポジトリ内のどこでもfooという名前は無視されます。
あなたのワイルドカードもまた冗長です。ディレクトリ全体を無視したい場合は、単純に名前を付けます。
lib/model/om
ワイルドカードを使用する唯一の理由は、後でディレクトリ内の何かを無視したくない場合です。
lib/model/om/* # ignore everything in the directory
!lib/model/om/foo # except foo
先頭のスラッシュは、無視エントリが.gitignoreファイルが存在するディレクトリに関してのみ有効であることを示します。 *.o
を指定すると、このディレクトリ内のすべての.oファイルとすべてのサブディレクトリが無視されます。一方、/*.o
はそのdir内のファイルだけを無視します。一方、/foo/*.o
は/foo/*.o内のファイルのみを無視します。
最上位レベルに.gitignoreファイルを置き、その下の任意のフォルダで機能させるには、/**/
を使用します。
例えば。 *.map
フォルダーおよびサブフォルダー内のすべての/src/main/
ファイルを無視するには、次のようにします。
/src/main/**/*.map
質問の両方の例は、実際には非常に悪い例であり、データ損失につながる可能性があります!
私のアドバイス:正当な理由がない限り、.gitignoreファイルのディレクトリに/*
を追加しないでください!
正当な理由は、たとえばジェフロミが書いたものです: "ディレクトリ内の何かを無視しないつもりなら"。
そうしないといけない理由は、ディレクトリに/*
を追加すると、一方でディレクトリのすべての内容を適切に無視するように動作するが、一方では危険な副作用があるからです。 :
git stash -u
(追跡および追跡されていないファイルを一時的にスタッシュする)またはgit clean -df
(追跡されていないが無視されたファイルを削除する)をリポジトリで実行すると、/*
が付加されて無視されるすべてのディレクトリbe 不可逆的に削除!
私はこれを難しい方法で学ばなければなりませんでした。私のチームの誰かが.gitignoreのいくつかのディレクトリに/*
を追加していました。時間が経つにつれて、特定のディレクトリが突然消えてしまうことがありました。アプリケーションに必要なギガバイトのローカルデータを含むディレクトリ。誰もそれを説明できず、私はいつもすべてのデータを再ダウンロードすることを嫌います。しばらくして、git stash
に関係しているのではないかという考えを思いつきました。ある日(無視されたファイルを保持したまま)ローカルリポジトリをクリーンアップしたかったのですが、git clean -df
を使用していて、データが失われました。今回は十分に問題を調査しました。最後に、理由は/*
が追加されていることだと思いました。
directory/*
はディレクトリ自体ではなく、ディレクトリのすべての内容を無視するという事実によって、どういうわけか説明できると思います。したがって、物事が削除されても、追跡されているとは見なされず、無視されません。 git status
とgit status --ignored
は、その上にわずかに異なる画像を与えますが。
動作を再現する方法は次のとおりです。現在Git 2.8.4を使用しています。
ダミーファイル(localdata/
)を含むimportant.dat
というディレクトリがローカルgitリポジトリに作成され、/localdata/*
ファイルに.gitignore
を入れることで内容が無視されます。上記の2つのgitコマンドのいずれかを実行すると、ディレクトリが(予期せず)失われます。
mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file
ここでgit status --ignored
を実行すると、以下が得られます:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
untracked-file
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
localdata/
どちらにするか
git stash -u
git stash pop
または
git clean -df
どちらの場合も、無視されたとされるディレクトリlocaldata
はなくなります!
これがバグと見なされるかどうかはわかりませんが、少なくとも誰も必要としない機能だと思います。
それをgit開発リストに報告して、彼らがそれについてどう思うか見てみましょう。
最初の1つ。これらのファイルパスは、.gitignoreファイルの場所からの相対パスです。
それはそのようになります:
config/databases.yml
cache
log
data/sql
lib/filter/base
lib/form/base
lib/model/map
lib/model/om
あるいはおそらく
config/databases.yml
cache
log
data/sql
lib/*/base
lib/model/map
lib/model/om
filter
とform
が、無視する必要があるbase
subdirectoryを持つ唯一のlibディレクトリです(アスタリスクでできることの例としてそれを見てください)。
私は https://www.gitignore.io で非常に簡単に.gitignore
テンプレートを生成することを可能にするGUIとCLIベースのサービスを保守しています。
検索フィールドに必要なテンプレートを入力するか、コマンドラインエイリアスをインストールして実行することができます。
$ gi Swift,osx
サンプルの .gitignore ファイルは、Android Studioプロジェクトの場合、以下のようになります。
# built application files
*.apk
*.ap_
# files for the dex VM
*.dex
# Java class files
*.class
# generated files
bin/
gen/
# Local configuration file (sdk path, etc)
local.properties
#Eclipse
*.pydevproject
.project
.metadata
bin/**
tmp/**
tmp/**/*
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
YourProjetcName/.gradle/
YourProjetcName/app/build/
*/YourProjetcName/.gradle/
*/YourProjetcName/app/build/
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# CDT-specific
.cproject
# PDT-specific
.buildpath
# Proguard folder generated by Eclipse
proguard/
# Intellij project files
*.iml
*.ipr
*.iws
.idea/
/build
build/
*/build/
*/*/build/
*/*/*/build/
*.bin
*.lock
YourProjetcName/app/build/
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
.gradle/
app/build/
*app/build/
# Local configuration file (sdk path, etc)
local.properties
/YourProjetcName/build/intermediates/lint-cache/api-versions-6-23.1.bin
appcompat_v7_23_1_1.xml
projectFilesBackup
build.gradle
YourProjetcName.iml
YourProjetcName.iml
gradlew
gradlew.bat
local.properties
settings.gradle
.gradle
.idea
Android
build
gradle