Gitで無視されたディレクトリのサブディレクトリを無視する


99

ディレクトリを無視したが、その中の特定のサブディレクトリを無視したくないとしましょう。だから私はセットアップを持っています:

/uploads/
/uploads/rubbish/
/uploads/rubbish/stuff/KEEP_ME/
/uploads/foo/
/uploads/foo/bar/lose/

そして、KEEP_MEディレクトリ以外はすべて無視したいと思います。無視が次のようになることを願っています:

/uploads/*
!/uploads/rubbish/stuff/KEEP_ME/

しかし、それは機能しておらず、同じテーマのいくつかの組み合わせも機能していません。

機能するのは

/uploads/**/**/**/
!/uploads/rubbish/stuff/KEEP_ME/

しかし、それは少し制限的で冗長に感じますか?


1
あなたが提供したコードは私にとってはうまくいきませんでした(gitバージョン1.9.1を使用)。/ uploads / *!/ uploads / rubbish / / uploads / rubbish / *!/ uploads / rubbish / stuff / uploads / rubbish / stuff / *!/ uploads / rubbish / stuff / keep(これは例に似ています)でgit-scm.com/docs/gitignore)。私のフォルダ構造; └README.md└uploads / foo / bar / lose / lose.txt└uploads / rubbish / stuff / keep / keep.txt
gihanchanuka

回答:


119

gitignoreドキュメントのパターンフォーマットセクションによると:

オプションの接頭辞「!」これはパターンを無効にします。以前のパターンによって除外された一致ファイルは、再び含まれます。そのファイルの親ディレクトリが除外されている場合、ファイルを再インクルードすることはできません。Gitはパフォーマンス上の理由から除外されたディレクトリを一覧表示しないため、含まれているファイルのパターンは、それらが定義されている場所に関係なく、影響を与えません。最初の "!"の前にバックスラッシュ( "\")を置きます たとえば、「!important!.txt」など、リテラル「!」で始まるパターンの場合。

したがって、以前に除外された親ディレクトリ/uploads/rubbish/stuff/keep/パターンは、その内容を無効にする前に排他的に無効にする必要があります。

#ignore everything within /uploads/ 
/uploads/*

#include everything within /uploads/rubbish/stuff/keep
!/uploads/rubbish/stuff/keep/  
!/uploads/rubbish/stuff/keep/*

内部にサブディレクトリを含めるには/uploads/rubbish/stuff/keep/、3行目を追加します。

!/uploads/rubbish/stuff/keep/**/*

1
使用しているgitのバージョンは何ですか?多分それは特定のバージョンでのみ利用可能なものです。

恥ずかしい。このコメントを投稿したのを忘れていました。しかし、私はそれを機能させました。FWIW、私は先頭のスラッシュを使いません。それが問題だったかどうか覚えていません。1.7.2.5を使用しています。

すべての* .zipファイルを無視したグローバルgitignoreファイルがあります。しかし、特定のプロジェクトでは、zipファイルを含めたいと思います。私はこの行をそのプロジェクトに追加しました、.gitignoreそしてそれはうまくいきます!:!*.zip
Jinghao Shi

フォルダーを除外し、サブフォルダーを含めながら、指定したフォルダーの前後の任意のディレクトリを明示的に指定する必要があることに気付きました。(完全な回答)。
Josiah Yoder

このメソッドは機能しません(git 2.25以降-gitの何かが変更された可能性があります)。修正として、以下のstackoverflow.com/a/60288435/295691を投稿しました。
user295691

34

に何かを追加した場合でも、gitにそれをインデックスに追加させる.gitignoreことができます。

git add --force uploads/rubbish/stuff/KEEP_ME/

ただし、「KEEP_ME」はディレクトリのようで、gitは通常空のフォルダーを好まないため、フォルダーが空の場合は、代わりに「プレースホルダー」ホルダーファイルを追加する必要があります。

git add --force uploads/rubbish/stuff/KEEP_ME/.keep_me

それに関する唯一の問題は、この特定の例が言及したはずのグローバルgitignoreを参照していることです。アイテムを強制的に追加できることはわかっていますが、新しいアイテムが追加された場合や、最初に新しいリポジトリごとに追加する必要があります。.keepは内容が無視されないようにしますか?
Wil

1
少しテストをしました。はい、のgit add --forceすべての新しいアイテムまたはフォルダに使用する必要がありますKEEP_ME。しかしその後は、git add -uファイルが「無視されていない」かのように、更新が追加されます(たとえば、実行する場合)。.keep_megitのフォルダ上で動作するように何も、そのわずかファイルもしません。
commonpike 2015年

1
git add --forceこれは間違った解決策です。ディレクトリを別のディレクトリに移動したり、ファイルを別のディレクトリに移動したりすると、gitの追跡によってファイルは削除されますが、新しい場所には追加されないため、git add --force再度実行する必要があります。一般的なパターンを無視しないことで、gitはリポジトリ内のファイルの移動を追跡します。
マーリン

これは私のために働いた唯一の解決策です。私のフォルダは無視されませんでしたが、どうしても追加できませんでした。この方法で解決しました。
Akito、

6

一般的な除外ですべてのフォルダーを除外するときに特定のフォルダーを含める方法を理解しようとしていました

**/build

/*一般的な除外の最後に追加すると、引き続きすべてのビルドファイルが除外されます**/build/*

次に、含める行を次のように修正する別の行を追加します

!**/folder/build/* 

私たちに読んでgitignoreを残します

**/build/* 
!**/folder/build/* 

2

Buo-Ren LinJohnの回答は非常に役立ちますが、両方を組み合わせる必要がありました。

アップロード内のファイルだけでなく他のサブフォルダーも除外したい場合、フォルダーを除外し、サブフォルダーを含めて、指定したフォルダーの前に任意のディレクトリを明示的に指定する必要があることに気付きました

**/uploads/*
!**/uploads/rubbish/
!**/uploads/rubbish/*

また、フォルダーとサブフォルダー内の両方のアイテムを表示するには、サブフォルダーとその内容の両方を明示的に再インクルードする必要があることもわかりました。


はぁ。ここで運はありません。これで何時間も。Git 2.20.1
RichieHH

@HörmannHH聞き取れませんでした。たぶん、新しい質問をする時がきましたか?
Josiah Yoder

2

最も支持されている答えとして提示されたソリューションは正しくなく、そのように簡単に実証できます。

uploads / *のすべてを無視することから始めます。

mkdir -p uploads/rubbish/stuff/KEEP_ME
touch uploads/a uploads/rubbish/a uploads/rubbish/stuff/a uploads/rubbish/stuff/KEEP_ME/a
echo '/uploads/*' >> .gitignore
git init
git add .
git commit -m "Initial commit"

上記のように、無視されたものの親ディレクトリを無視します。

echo 'uploads/rubbish/stuff/KEEP_ME/' >> .gitignore
echo 'uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u

追跡されていないファイルは表示されません。

これを機能させるには、uploads/ツリーの下にあるすべてのファイル(uploads/**/*だけでなく、最上位レベルuploads/*)を無視して、保持するツリーのすべての親ディレクトリを追加する必要があります。

echo '/uploads/**/*' > .gitignore
echo '!/uploads/rubbish/' >> .gitignore
echo '!/uploads/rubbish/stuff' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u

それは与える:

On branch master
...
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        uploads/rubbish/stuff/KEEP_ME/a

上記で使用uploads/*した.gitignore場合、すべての中間ファイルも含まれているため、たとえばuploads/rubbish/a上記のstatusコマンドに表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.