今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

gitignore指定ファイルを無視しない

背景#

腾讯 IMSDK を使用している場合、対応するライブラリを Pod 依存関係に追加し、Pods フォルダを.gitignoreで無視するように設定しましたが、IM SDK のソースコードを変更する必要があり、再インストール後に上書きされることを心配しています。そのため、腾讯 IMSDK に対して.gitignoreで無視しないように設定したいと思います。どのようにすればよいですか?

実装#

以下のように設定します:


!/Pods/
/Pods/*
!/Pods/TUI*/

設定した後、効果がない場合は、次のコマンドを使用して確認できます:


git check-ignore -v Pods/TUIChat/

以下の図のように、最初のチェックでは.gitignoreの特定の行が無視されることが示され、修正後に再実行すると結果が表示されず、成功したことがわかります。

例

原理#

転載元: [Git].gitignore ファイルの設定と使用方法

.gitignore の無視ルールのマッチング構文は次のとおりです:

.gitignoreファイルでは、各行の無視ルールの構文は次のとおりです:
1. 空白は任意のファイルにマッチしません。区切り文字として使用でき、バックスラッシュでエスケープすることができます。
2. 「#」で始まる行はGitによって無視されます。つまり、#で始まるファイルはコメントとして扱われ、バックスラッシュを使用してエスケープすることができます。
3. 標準のグロブパターンを使用できます。グロブパターンとは、シェルで使用される簡略化された正規表現のことです。
4. スラッシュ「/」で始まる場合、ディレクトリを示します。スラッシュ「/」で終わるパターンは、フォルダーとそのフォルダーパスの内容にマッチしますが、そのファイル自体にはマッチしません。「/」で始まるパターンはプロジェクトのルートディレクトリにマッチします。パターンにスラッシュが含まれていない場合、それは現在の.gitignoreファイルのパスを基準にして内容にマッチします。.gitignoreファイルにそのパターンが含まれていない場合、プロジェクトのルートディレクトリを基準にします。
5. アスタリスク「*」は複数の文字にマッチします。つまり、複数の任意の文字にマッチします。「**」を使用すると、任意の中間ディレクトリにマッチします。たとえば、a/**/zはa/z、a/b/z、a/b/c/zなどにマッチします。
6. ワイルドカード「?」は1つの文字にマッチします。つまり、任意の1つの文字にマッチします。
7. 角括弧「[]」で囲まれた1つの文字の一致リストを含むパターンにマッチします。たとえば、[abc]はaに一致するか、bに一致するか、cに一致するかを示します。角括弧内でハイフンで区切られた2つの文字を使用すると、その範囲内のすべての文字に一致します。たとえば、[0-9]は0から9までのすべての数字に一致し、[a-z]は任意の小文字に一致します。
8. ビックリマーク「!」は一致したファイルまたはディレクトリを無視せず(追跡する)、指定されたパターン以外のファイルまたはディレクトリを無視することを示します。パターンの前にエクスクラメーションマーク(!)を追加することで否定を示します。特に注意が必要なのは、ファイルの親ディレクトリが既に前のルールで除外されている場合、このファイルに!ルールを使用しても効果がありません。つまり、!で始まるパターンは否定を示し、そのファイルは再度含まれますが、そのファイルの親ディレクトリが除外されている場合、!を使用しても再度含まれません。バックスラッシュを使用してエスケープすることができます。

注意事項:.gitignore ファイルは、上から下へと行ごとにマッチングルールを適用するため、前のルールがより大きな範囲にマッチする場合、後続のルールは適用されません。

** 非常に重要:** もし.gitignore ファイルを作成する前にプロジェクトを push してしまった場合、.gitignore ファイルに新しいフィルタルールを書いても効果がありません。これらのルールは Git がすでにこれらのファイルを管理しているためです。つまり、これらのファイルをフィルタリングするためにフィルタルールを使用することはできません。したがって、プロジェクトを開始する前に.gitignore ファイルを作成する習慣を身につける必要があります。そうしないと、push した後の処理が非常に面倒になります。


#               これはコメントで、Gitによって無視されます
*.a             .aで終わるすべてのファイルを無視します
!lib.a          lib.aを除外します
/TODO           プロジェクトのルートディレクトリにあるTODOファイルのみを無視します。subdir/TODOは含まれません
build/          build/ディレクトリのすべてのファイルを無視します。buildフォルダ全体をフィルタリングします
doc/*.txt       doc/notes.txtを無視しますが、doc/server/arch.txtは無視しません
 
bin/:           現在のパスのbinフォルダーを無視します。binフォルダーのすべての内容が無視されますが、binファイルは無視されません
/bin:           ルートディレクトリのbinフォルダーを無視します
/*.c:           cat.cを無視しますが、build/cat.cは無視しません
debug/*.obj:    debug/io.objを無視しますが、debug/common/io.objおよびtools/debug/io.objは無視しません
**/foo:         /foo、a/foo、a/b/fooなどに一致します
a/**/b:         a/b、a/x/b、a/x/y/bなどに一致します
!/bin/run.sh    binディレクトリのrun.shファイルを無視しません
*.log:          すべての.logファイルを無視します
config.php:     現在のパスのconfig.phpファイルを無視します
 
/mtk/           フォルダ全体をフィルタリングします
*.zip           すべての.zipファイルをフィルタリングします
/mtk/do.c       特定のファイルをフィルタリングします
 
フィルタリングされたファイルは、Gitリポジトリ(GitLabまたはGitHub)に表示されません。ただし、ローカルリポジトリにはまだ存在しますが、プッシュする際にはアップロードされません。
 
注意する必要があるのは、gitignoreはどのファイルをバージョン管理に追加するかを指定することもできるということです。次のように指定できます:
!*.zip
!/mtk/one.txt
 
唯一の違いは、ルールの先頭に感嘆符が追加されることです。Gitは、このようなルールに一致するファイルをバージョン管理に追加します。なぜ2つのルールが必要なのでしょうか?
シナリオを想像してみてください:/mtk/ディレクトリのone.txtファイルのみを管理する必要がある場合、このディレクトリの他のファイルは管理する必要がありません。したがって、.gitignoreルールは次のように書く必要があります:
/mtk/*
!/mtk/one.txt
 
フィルタルールの前に/mtk/*を/mtk/と書くことはできません。なぜなら、bin/の親ディレクトリが前のルールで除外されているため、one.txtファイルは!ルールを持っていても効果がありません!

----------------------------------------------------------------------------------
以下のようなルールもあります:
fd1/*
説明:fd1ディレクトリ以下のすべての内容を無視します。注意:ルートディレクトリの/fd1/ディレクトリだけでなく、/child/fd1/ディレクトリなどのサブディレクトリも無視されます。
 
/fd1/*
説明:ルートディレクトリの/fd1/ディレクトリのすべての内容を無視します。
 
/*
!.gitignore
!/fw/ 
/fw/*
!/fw/bin/
!/fw/sf/
説明:すべての内容を無視しますが、.gitignoreファイル、ルートディレクトリの/fw/bin/および/fw/sf/ディレクトリは無視しません。bin/の親ディレクトリに!ルールを適用するため、除外されません。

もし.gitignoreが機能しない場合は、次の操作を試してみてください: .gitignore ファイルの無視ルール

1. git rm -r --cached .
2. git add .
3. git commit -m "update .gitignore"

理由は、.gitignore ファイルが設定された後、しばしば効果がないことです。これは、.gitignore が追跡されていない(track されていない)ファイルのみを無視できるためです。Git にはローカルキャッシュが存在するため、ファイルがすでにバージョン管理されている場合、.gitignore を変更しても効果がありません。したがって、Git のローカルキャッシュを削除し、再度コミットする必要があります。

参考#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。