電話のネイティブブラウザでテストしているときに、gitを使用してphonegapに同期しています。そのため、次の行があります。
var isPhoneGap = false;
ビルド時に明らかにこれを変更しますが、この1行を無視するようにgitを設定する方法はありますか、それとも独自のファイルに入れて無視する必要がありますか?
OSX 10.6でGitxとターミナルを使用しています。
電話のネイティブブラウザでテストしているときに、gitを使用してphonegapに同期しています。そのため、次の行があります。
var isPhoneGap = false;
ビルド時に明らかにこれを変更しますが、この1行を無視するようにgitを設定する方法はありますか、それとも独自のファイルに入れて無視する必要がありますか?
OSX 10.6でGitxとターミナルを使用しています。
回答:
ファイルが特定のタイプである場合、ファイルで宣言できるコンテンツフィルタードライバーを宣言でき.gitattributes
ます(「Git属性」の「キーワード拡張」に示されています)。
*.yourType filter=yourFilterName
(必要に応じて、特定のファイルにそのフィルターを設定することもできます)
実装:
yourFilterName.smudge
(でトリガーgit checkout
)および
git config --global filter.yourFilterName.smudge 'sed "s/isPhoneGap = .*/isPhoneGap = true/"'
yourFilterName.clean
(でトリガーgit add
)
git config --global filter.yourFilterName.clean 'sed "s/isPhoneGap = .*/isPhoneGap = false/"'
ファイルはで変更されずに表示されますがgit status
、チェックアウトされたバージョンはの正しい値になりisPhoneGap
ます。
git diff or
gitステータスを作成する方法を知っていますか?だから私はまだ何が違うのか見ることができますか?私の使用例はデバッグログ用です...最終的には削除したい... @jthill @VonC
sh ".git/helper.sh"
パラメーターを確実に通過させました"$@"
(ファイルパスだけが渡されたと想定しています)。
使用できます
git update-index --assume-unchanged [file]
追跡したくない1つのファイルの変更を無視します。リポジトリにファイルが必要なときにこのソリューションを使用しますが、このファイルには変更が必要な部分があり、常に追跡する必要はありません。
ファイルに重要な変更がある場合、これを行う必要があります。
git update-index --no-assume-unchanged [file]
また、パラメーターについては、Git doc update-indexを参照して--[no-]assume-unchanged
ください。
これらのフラグを指定すると、パスに記録されたオブジェクト名は更新されません。代わりに、これらのオプションは、パスの「変更されていない」ビットを設定および設定解除します。「変更されていない」ビットがオンになっていると、gitは作業ツリーファイルの変更のチェックを停止するため、手動でビットの設定を解除して、作業ツリーファイルを変更したときにgitに通知する必要があります。
--skip-worktree
ほとんどの目的のためのより良いオプションだと思います。stackoverflow.com/a/39583010/4233593
https://stackoverflow.com/a/20574486/4935114を続けて、@ Mikeは、ステージングされたファイルで無視したい行のpre-commit
フックを作成することを提案しましたgrep
。フックはそれらの行がステージングされたかどうかをチェックします。もしそうなら、それはecho
警告であり、それexit
はコードである1
ので、コミットプロセスは続行されません。
@Mike の回答に触発されて、私はおそらく、無視したい特定の行を自動的に reset
(-p
フラグ付きで)sする、彼のフックの改良版を使用していることに気付きました。
このフックが無視されるこの行を持つ多くのファイルがある状況でこのフックが機能するかどうかはわかりませんが、このpre-commit
フックは特定のファイルでこの行の変更を探しますbuildVars.java
。私のマシンでテストしたとき、フックスクリプトは次のようになりました。
#!/bin/sh
# this hook looks for lines with the text `var isPhoneGap = false;` in the file `buildVars.java` and it resets these lines to the previous state before staged with `reset -p`
if [[ $(git diff --no-ext-diff --cached buildVars.java | grep --count -e "var\ isPhoneGap[\ ]*=[\ ]*") -ne 0 ]]; then
cat <<EOW
WARNING: You are attempting to commit changes which are not supposed to be commited according to this \`pre-commit\` hook
This \`pre-commit\` hook will reset all the files containing this line to it's previous state in the last commit.
EOW
echo /$'\n'isPhoneGap$'\n'y$'\n'q | git reset -p
# BONUS: Check if after reseting, there is no actual changes to be commited and if so, exit 1 so the commit process will abort.
if [[ $(git diff --no-ext-diff --cached | wc -l) -eq 0 ]]; then
echo there are no actual changes to be commited and besides the change to the variable \'isPhoneGap\' so I won\'t commit.
exit 1
fi
fi
私が行ったのはisPhoneGap
、対話型reset
プロセス中に正規表現を検索する制御シーケンスをエコーすることでした。このように押したユーザーエミュレーション/
を検索するためにisPhoneGap
、プレスy
彼はこのパッチを破棄したい、最後に押したかどうかを尋ねられたときq
、対話型を終了することをreset
。
インタラクティブなリバースパッチプロセスについては、https://git-scm.com/docs/git-add#git-add-patchで説明されています。
注:上記のスクリプトは、変数interactive.singleKey
がであることを前提としていますfalse
。をに設定した場合は、警告の直後にコマンドからtrue
削除してください。$'\n'
echo
これは、gitフィルターで実行できる方法です。
*.rb filter=gitignore
、つまりgitignore
すべての*.rb
ファイルで指定されたフィルターを実行gitignore
フィルターを定義しますgitconfig
。
$ git config --global filter.gitignore.clean "sed '/#gitignore$/'d"
、つまりこれらの行を削除します$ git config --global filter.gitignore.smudge cat
、つまり、リポジトリからファイルをプルするときに何もしない注:
もちろん、これは、行がで終わるとき#gitignore
に適用され、グローバルにに適用されるルビーファイル用です~/.gitconfig
。ただし、目的に応じてこれを変更してください。
警告!!
これにより、作業ファイルが(もちろん)リポジトリとは異なります。チェックアウトまたはリベースすると、これらの行が失われます。これらの行はチェックアウト、リベース、またはプルで繰り返し失われるため、このトリックは役に立たないように見えるかもしれませんが、私はそれを利用するために特定のユースケースを持っています。
ただ、git stash save "proj1-debug"
フィルタがアクティブである間(ちょうど一時的にそれを無効にするgitconfig
か何か)。このようにしてgit stash apply
、これらの行が誤ってコミットされることを恐れずに、いつでもデバッグコードをいつでもコードに適用できます。
これらの問題に対処するための考えられるアイデアはありますが、別の機会に実装してみます。
gitフィルターとgitattributesについて言及してくれたRudiとjw013に感謝します。
コンテンツフィルタードライバーは適切なソリューションではありません。この行をgit status
/ etc から隠すことができるかもしれませんが、実際には無視されていません。値を変更すると、変更が表示されない場合でも、作業ディレクトリはダーティとマークされます。
この行をバージョン管理の対象から外したい場合は、コマンドライン引数に変更するか、無視されたインクルードファイルまたはビルドファイルに配置することが唯一の実用的な方法です。
これは、ソースの複数行で発生する可能性があるものだと思います。
含めるだけのデフォルトの.userbuildconfigファイルを用意し、デフォルトをチェックインするのが最もクリーンだと思います。次に、Carlosの提案を使用して、そのファイルのみを変更されないと見なすようにマークできます。このようにして、設定を確認する必要があるファイルへの他の変更を見逃すことはありません。
これにより、ローカルでプリプロセッサマクロを調整できます(または、Javaの場合は、このようなhttps://stackoverflow.com/a/1813873/1270965)。