web-dev-qa-db-ja.com

.gitignoreフォルダを除外し、特定のサブフォルダを含める

私は.gitignoreに追加するフォルダapplication /を持っています。 application /フォルダの中には、application/language/grフォルダがあります。このフォルダを含めるにはどうすればいいですか。私はこれを試しました

application/
!application/language/gr/

運なしで...

773
chchrist

application/を除外すると、その下のすべてが常に除外されます(たとえ後の否定除外パターン(「unignore」)がapplication/の下の何かに一致する場合でも)。

あなたが望むことをするためには、あなたはあなたが「無視する」ことを望むもののすべての親ディレクトリを「無視する」必要があります。通常、この状況に対するルールをペアで書くことになります。ディレクトリ内のすべてを無視しますが、特定のサブディレクトリは無視しません。

# you can skip this first one if it is not already excluded by prior patterns
!application/

application/*
!application/language/

application/language/*
!application/language/gr/

注意
末尾の/*は重要です。

  • パターンdir/は、dirという名前のディレクトリとその下にあるすべてのものを除外します。
    dir/を指定した場合、Gitはdirの下にあるものを調べず、したがってdirの下にあるものに「除外」パターンを適用することはありません。
  • パターンdir/*dir自体については何も言いません。それは単にdirの下のすべてを除外します。 dir/*を使うと、Gitはdirの直接の内容を処理し、他のパターンに内容の一部を「除外しない」機会を与えます(!dir/sub/)。
1304
Chris Johnsen

Commit 59856de from Karsten Blees(kblees) Git 1.9/2.0(2014年第1四半期)では、そのケースを明確にしています:

gitignore.txt :除外されたディレクトリの再帰的な性質を明確にします

パターンを無効にするオプションのプレフィックス「!」。以前のパターンで除外された一致するファイルは再び含まれます。

ファイルの親ディレクトリが除外されている場合、ファイルを再インクルードすることはできません。 (*
*:git 2.8+で特定の条件が満たされない限り、以下を参照)
Gitはパフォーマンス上の理由から除外ディレクトリをリストしません。そのため、含まれているファイルのパターンは、それらがどこで定義されていても効果がありません。

\」などのリテラル「!」で始まるパターンの場合、最初の「!」の前にバックスラッシュ(「\!important!.txt」)を置きます。

特定のディレクトリfoo/bar以外をすべて除外する例(/*に注意してください-スラッシュなしで、ワイルドカードはfoo/bar内のすべても除外します):

 --------------------------------------------------------------
     $ cat .gitignore
     # exclude everything except directory foo/bar
     /*
     !/foo
     /foo/*
     !/foo/bar
 --------------------------------------------------------------

あなたの場合:

application/*
!application/**/
application/language/*
!application/language/**/
!application/language/gr/**

特定のフォルダー内のファイルをホワイトリストに登録する前に、フォルダーをホワイトリストに登録する必要があります。


2016年2月/ 3月の更新:

Git 2.9.x/2.10(2016年半ば?)では、そのファイルの親ディレクトリが除外されている場合、ファイルを再インクルードできる可能性があることに注意してください パスにワイルドカードが含まれていない場合

NguyễnTháiNgọcDuy(pclouds はこの機能を追加しようとしています:

Git 2.9+では、これは実際には機能していましたが、最終的に元に戻りました。

application/
!application/language/gr/
123
VonC

@Chris Johnsenの答えは素晴らしいですが、Gitの新しいバージョン(1.8.2以降)では、もう少し簡単な解決策に利用できる2つのアスタリスクパターンがあります。

# assuming the root folder you want to ignore is 'application'
application/**/*

# the subfolder(s) you want to track:
!application/language/gr/

これにより、追跡したいサブフォルダの親ディレクトリを「無視」する必要がなくなります。


Git 2.17.0(このバージョンの前の早い時期にはわからない。おそらく1.8.2に戻る)では、あなたのファイルに至るまでの各サブディレクトリに対して**パターンをexcludeと組み合わせて使うことでうまくいく。例えば:

# assuming the root folder you want to ignore is 'application'
application/**

# Explicitly track certain content nested in the 'application' folder:
!application/language/
!application/language/gr/
!application/language/gr/** # Example adding all files & folder in the 'gr' folder
!application/language/gr/SomeFile.txt # Example adding specific file in the 'gr' folder
45
rpyzh

これについても同様の質問がたくさんありますので、私が以前に書いたものを投稿します。

これを私のマシンで動作させる唯一の方法は、次のようにすることでした。

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*/*

含める各レベルのコンテンツを明示的に許可する必要があることに注意してください。したがって、テーマの下に5つのサブディレクトリがある場合でも、それを綴る必要があります。

これはここ@ Yarinのコメントからです: https://stackoverflow.com/a/5250314/1696153

これらは役に立つトピックでした:

私も試した

*
*/*
**/**

**/wp-content/themes/**

または/wp-content/themes/**/*

どちらも私にとってはうまくいきませんでした。歩道とエラーがたくさん!

14
Katie S

私はこれだけ見つけました 実際に works。

**/node_modules/*
!**/node_modules/keep-dir
8
Steve Kling

それで、多くのプログラマーがノードを使うので。この問題を満たすユースケースは、1つのモジュールnode_modulesを除いてmodule-aを除外することです。例えば、

!node_modules/

node_modules/*
!node_modules/module-a/
4
Abdennour TOUMI

私はここでも似たようなケースを発見しました。デフォルトでは、.gitignoreはアスタリスクを使っているすべてを無視してからパブリックディレクトリを上書きします。

*
!public
!.gitignore

OPシナリオに遭遇した場合、これでは不十分です。

publicの特定のサブフォルダをコミットしたい場合は、あなたのpublic/productsディレクトリに、1サブフォルダの深さのファイルを含めたいです。 public/products/a/b.jpgを含めるには、これらを!/public/products!public/products/*などのように追加しても、正しく検出されません。

解決策は、このようにすべてのパスレベルにエントリを追加して、それらすべてを上書きすることです。

*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*
3
blamb

特に古いGitバージョンでは、ほとんどの提案はそれほどうまくいきません。その場合は、他の設定に関係なくコンテンツを含めるディレクトリに別の.gitignoreを配置し、そこで必要なものを許可します。

例えば、/.gitignore

# ignore all .dll files
*.dll

/dependency_files/.gitignore

# include everything
!*

そのため、/ dependency_files(.dllファイルも含む)内のすべてが問題なく含まれています。

3
Breit

ちょうどあなたが望むものを得るためにディレクトリ構造をたどることのちょうど別の例。注:私はLibrary/を除外しませんでしたがLibrary/**/*

# .gitignore file
Library/**/*
!Library/Application Support/
!Library/Application Support/Sublime Text 3/
!Library/Application Support/Sublime Text 3/Packages/
!Library/Application Support/Sublime Text 3/Packages/User/
!Library/Application Support/Sublime Text 3/Packages/User/*macro
!Library/Application Support/Sublime Text 3/Packages/User/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/*settings
!Library/Application Support/Sublime Text 3/Packages/User/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/*theme
!Library/Application Support/Sublime Text 3/Packages/User/**/
!Library/Application Support/Sublime Text 3/Packages/User/**/*macro
!Library/Application Support/Sublime Text 3/Packages/User/**/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/**/*settings
!Library/Application Support/Sublime Text 3/Packages/User/**/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/**/*theme

> git add Library

> git status

On branch master
Your branch is up-to-date with 'Origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   Library/Application Support/Sublime Text 3/Packages/User/Default (OSX).sublime-keymap
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ElixirSublime.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Package Control.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Preferences.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/RESTer.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/SublimeLinter/Monokai (SL).tmTheme
    new file:   Library/Application Support/Sublime Text 3/Packages/User/TextPastryHistory.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ZenTabs.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/adrian-comment.sublime-macro
    new file:   Library/Application Support/Sublime Text 3/Packages/User/json-pretty-generate.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/raise-exception.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/trailing_spaces.sublime-settings
3
Adrian Dunston

私は.gitignoreを設定する代わりに直接または直接.includeによって無視されるディレクトリに含めたい(サブ)ディレクトリを定義する別の.gitignoreファイルを作成するCLIでこの回避策をよく使用します。

したがって、私はさらに使用します

git add `cat .include`

ステージング中、コミット前.

OPには、これらの行を持つ.includeを使うことをお勧めします。

<parent_folder_path>/application/language/gr/*

注:catを使用しても、$ HOME(またはその他の特定のディレクトリ)を指定するための(.include内の)エイリアスの使用は許可されません。これは、上記のコマンドを使用してhomedir/app1/*に渡された行git addgit add 'homedir/app1/*'として表示され、各文字のリテラル値が引用符で囲まれているため、エイリアスが防止されるためです(homedir) )機能している( Bashの一重引用符 を参照)。

これは私が私のレポ ここ で使用する.includeファイルの例です。

/home/abhirup/token.txt
/home/abhirup/.include
/home/abhirup/.vim/*
/home/abhirup/.viminfo
/home/abhirup/.bashrc
/home/abhirup/.vimrc
/home/abhirup/.condarc
2
Abhirup Das

gitignore - 意図的に追跡されていないファイルを無視するように指定します。

特定のディレクトリfoo/bar以外のすべてを除外する例(/ *に注意 - スラッシュなしで、ワイルドカードはfoo/bar内のすべても除外します) :

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

WordPressの他の例:

!/wp-content
wp-content/*
!/wp-content/plugins
wp-content/plugins/*
!wp-content/plugins/my-awesome-plugin

ここでより多くの情報: https://git-scm.com/docs/gitignore

2
Ali

WordPressにおいて、これは私を助けました:

wp-admin/
wp-includes/
/wp-content/*
!wp-content/plugins/
/wp-content/plugins/*
!/wp-content/plugins/plugin-name/
!/wp-content/plugins/plugin-name/*.*
!/wp-content/plugins/plugin-name/**
2
T.Todua

追加の回答を追加してください。

!/.vs/              <== include this folder to source control, folder only, nothing else
/.vs/*              <== but ignore all files and sub-folder inside this folder
!/.vs/ProjectSettings.json <== but include this file to source control
!/.vs/config/       <== then include this folder to source control, folder only, nothing else
!/.vs/config/*      <== then include all files inside the folder

これが結果です。

enter image description here

1
Dongdong

私はjquery production jsファイルを追跡したいと思っていましたが、これはうまくいきました:

node_modules/*
!node_modules/jquery
node_modules/jquery/*
!node_modules/jquery/dist/*
0
Indrek Ruubel

最も簡単でおそらく最善の方法はファイルを手動で追加することです(一般にこれは.gitignore-styleルールよりも優先されます)。

git add /path/to/module

-Nintentにフラグを追加して、フラグを追加するよう提案することもできますが、すぐには追加しないでください。私はまだステージングする準備ができていない新しいファイルに対してこれを頻繁に行います。


これは 回答のコピー で、簡単にQAが重複する可能性があるものについて投稿しました。見やすくするためにここに再投稿しています - gitignoreルールを混同しないほうが簡単です。

0
D. Ben Knoble