汚れ/きれいなフィルターに関連する多くの関連する質問があります-私はそれらを読んで、さまざまなオプションを試してみましたが、まだ失敗しています. 自分に合った答えが得られるように質問できればと思います。
具体的には、これらの回答のほとんどが次のページにリンクしているページを読みました。
tl;dr
詳細な質問ですが、要約は次のとおりです。
- スマッジ/クリーン フィルタを使用してファイルを管理するために、
DEBUG = false
あるブランチのファイルと別のブランチにファイルを保存できますか?DEBUG = true
そしてどうやって?
バックグラウンド
bitbucket でホストされているさまざまなリモート リポジトリがあります。リモートリポジトリをラップトップに複製するために、Win8でSourceTreeを使用しています。開発、機能、リリースなどのためにさまざまなブランチを作成します (良くも悪くも成功した Git ブランチ モデルに従います)。
Dbug.java
コード内のさまざまなデバッグログ、モックなどの機能をオン/オフするブール値を含むAndroid Java クラスがあります。
public static final boolean DEBUG = false;
この値をfalse
「本番」(マスター) ブランチにtrue
置き、フィーチャー ブランチに置きたいと思います。
- これはフィルターを使用して可能ですか、それともユースケースをすでに誤解していますか?
- ローカルでホストされている同じリポジトリの 2 つのブランチ間でフィルターがこのように機能するのか、それともフィルターが 2 つのリポジトリ間でのみ機能するのかはわかりません。
フィルターの作成
ローカルで作業し、プロダクション ブランチを調べました。debug_flag.txt
次の内容で呼び出されるテスト ファイルを作成しました。
// false on production branch
// true on other branches
DEBUG = false;
というローカル リポジトリのルートにファイルを作成し、.gitattributes
それにフィルター参照を追加しました。
debug_flag.txt filter=debug_on_off
.git/config
フィルター定義でファイルを更新しました。
[filter "debug_on_off"]
clean = sed -e 's/DEBUG = true/DEBUG = false/'
smudge = sed -s 's/DEBUG = false/DEBUG = true/'
- 私の理解では、これにより、本番環境では常にファイルの値が false になるはずですが、本番環境から分岐すると true の値になります。
- これは正しい理解ですか?
フィルタのテスト
test
以下を使用して新しいブランチを作成しました。
git checkout -b test
ファイルの内容を確認しました:
$ cat debug_flag.txt
// false on production branch
// true on other branches
DEBUG = false;
true
ファイルに値が表示されることを期待していました- ファイルをチェックアウトしたときに「汚れ」フィルターが実行されているはずではありませんか?
ファイルに新しい行を追加し、コミットしました。その後、本番ブランチに戻りましたが、ここで奇妙なことが起こりました。
SourceTree でファイルを見ると、このブランチは作成されてから変更されていません。唯一の変更は別のブランチで行われたため、それは私が期待することです。
ターミナルまたは Notepad++ でファイルを見ると、値が変更されていることがわかります。
$ cat debug_flag.txt
// false on production branch
// true on other branches
DEBUG = true;
私はまだテスト ブランチから変更をマージしていません。プロダクション ブランチでコミットしていませんが、ファイルが変更されています。
- このブランチ内のファイルに対してスマッジ フィルタが実行されたようですが、ブランチ間では実行されませんでした。
パズルの重要なピースが欠けています。できれば、これを行った経験のある人が見つけられる単純なものであることを願っています。
私の賭けは、これは概念の単純な誤解です。
欠落している情報がある場合は、プロンプトを表示してください...
VonC の返信に基づく更新
基本的なフィルターの設定は非常にうまくいきました。config
ファイル内のフィルターを次のように定義しました。
[filter "debug_on_off"]
clean = sed -e 's/DEBUG = true/DEBUG = false/'
smudge = sed -s 's/DEBUG = false/DEBUG = true/'
新しいブランチを作成すると false -> true が修正され、マージ バックすると true -> false に変更されます。
変更を本番 (マスター) ブランチだけに限定するには、実行元のブランチを認識するカスタム スクリプトが必要でした。したがって、config
ファイルは次のようになりました。
[filter "debug_on_off"]
clean = ./scripts/master_clean.sh
smudge = ./scripts/master_smudge.sh
master_clean.sh:
#!/bin/sh
branch=$(git rev-parse --symbolic --abbrev-ref HEAD)
if [ "master" = "$branch" ]; then
sed -e s/DEBUG = true/DEBUG = false/ $1
else
cat $1
fi
master_smudge.sh:
#!/bin/sh
branch=$(git rev-parse --symbolic --abbrev-ref HEAD)
if [ "master" = "$branch" ]; then
sed -e s/DEBUG = false/DEBUG = true/ $1
else
cat $1
fi
この時点で、デバッグ ファイルの内容について、SourceTree で表示されているものと Notepad++ で表示されているものとの間に矛盾が生じています。SourceTree には変更が表示されていますが、Notepad++ には表示されていません。
私が提起した基本的な質問に答えているので、VonCの答えを受け入れています。
ただし、解決しようとしている根本的な問題を (私にとっては) 簡単な方法で解決するため、私が書いたソリューションを実装する可能性があります: 別のブランチに別の構成ファイルを保持します。