今是昨非

今是昨非

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

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)に表示されません。ただし、ローカルリポジトリにはまだ存在しますが、pushする際にはアップロードされません。
 
注意点として、.gitignoreにはバージョン管理に追加するファイルを指定することもできます。以下のように指定します:
!*.zip
!/mtk/one.txt
 
唯一の違いは、ルールの先頭に感嘆符が追加されることです。Gitは、このようなルールに一致するファイルをバージョン管理に追加します。なぜ2つのルールが必要なのでしょうか?
シナリオを想像してみてください:/mtk/ディレクトリのone.txtファイルのみを管理する必要がある場合、このディレクトリの他のファイルは管理する必要がない場合、.gitignoreルールは次のように書かれる必要があります:
/mtk/*
!/mtk/one.txt
 
フィルタリングルールの前に/mtk/ディレクトリの親ディレクトリを!ルールで指定する必要があるため、!ルールを使用して除外されないようにするためです。

.gitignore が機能しない場合は、次の操作を試してみてください: .gitignore ファイルのフィルタリングルール

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

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

参考#

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