私は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 update-index --assume-unchanged [file]
追跡したくない1つのファイルの変更を無視します。リポジトリにファイルを保存する必要があるときにこのソリューションを使用しますが、このファイルには変更が必要な部分があり、常に追跡する必要はありません。
ファイルに重要な変更がある場合、これを行う必要があります。
git update-index --no-assume-unchanged [file]
また、--[no-]assume-unchanged
パラメーターの Git doc update-index も参照してください。
これらのフラグを指定すると、パスに対して記録されたオブジェクト名は更新されません。代わりに、これらのオプションは、パスの「変更なしと想定」ビットを設定および設定解除します。 「変更なしと想定」ビットがオンの場合、gitは作業ツリーファイルで可能な変更のチェックを停止するため、作業ツリーファイルを変更したときにgitに通知するにはビットを手動で設定解除する必要があります。
Gitxを使用すると、個々の行をコミットまたは無視できます(既に知っているかもしれません)が、コミットするたびにそれを行う必要があります。配置ターゲットごとに設定ファイルを用意し(バージョン管理できます)、サーバーを起動しているときの実行時パラメーター(./myserver --config=whatever.js
)。
継続 https://stackoverflow.com/a/20574486/4935114 、 @Mike はgrep
を挿入するpre-commit
フックを作成することを提案しました無視したい行のステージングされたファイル。フックは、これらの行がステージングされたかどうかを確認します。その場合、echo
sは警告であり、exit
はコード1
であるため、コミットプロセスは続行しません。
@ Mike's answer に触発され、私はおそらく彼のフックの改良版を使用していることに気付きましたautomaticallyreset
s (-p
フラグを使用)無視する特定の行。
この行が無視される多くのファイルがある状況でこのフックが機能するかどうかはわかりませんが、この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
に設定している場合は、警告の直後にecho
コマンドから$'\n'
を削除します。
これは、 git filters を使用して行う方法です。
*.rb filter=gitignore
、つまり、すべての*.rb
ファイルに対してgitignore
という名前のフィルターを実行しますgitignore
:でgitconfig
フィルターを定義します$ git config --global filter.gitignore.clean "sed '/#gitignore$/'d"
、つまりこれらの行を削除します$ git config --global filter.gitignore.smudge cat
、つまり、リポジトリからファイルをプルするときに何もしませんノート:
もちろん、これはRubyファイル、行が#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 )。