web-dev-qa-db-ja.com

Gitは特定の行を無視できますか?

私はgitを使用して、電話のネイティブブラウザーでテストしながらphonegapに同期しています。そのため、次の行があります。

var isPhoneGap = false;

明らかに、ビルド時にこれを変更しますが、この1行を無視するようにgitをセットアップする方法はありますか、それを独自のファイルに入れて無視する必要がありますか?

OSX 10.6でGitxとターミナルを使用しています。

92
Iolo

ファイルが特定のタイプの場合は、 コンテンツフィルタードライバー を宣言できます。これは、.gitattributesファイルで宣言できます(「 Git属性 "):

http://git-scm.com/figures/18333fig0702-tn.png

*.yourType filter=yourFilterName

(必要に応じて 特定のファイルにフィルターを設定 することもできます)

実装:

  • yourFilterName.smudgegit checkoutでトリガー)および

    git config --global filter.yourFilterName.smudge 'sed "s/isPhoneGap = .*/isPhoneGap = true/"'
    
  • yourFilterName.cleangit addでトリガー)

    git config --global filter.yourFilterName.clean 'sed "s/isPhoneGap = .*/isPhoneGap = false/"'
    

ファイルはgit statusで変更されずに表示されますが、チェックアウトされたバージョンはisPhoneGapに適切な値を持ちます。

86
VonC

使用できます

git update-index --assume-unchanged [file]

追跡したくない1つのファイルの変更を無視します。リポジトリにファイルを保存する必要があるときにこのソリューションを使用しますが、このファイルには変更が必要な部分があり、常に追跡する必要はありません。

ファイルに重要な変更がある場合、これを行う必要があります。

git update-index --no-assume-unchanged [file]

また、--[no-]assume-unchangedパラメーターの Git doc update-index も参照してください。

これらのフラグを指定すると、パスに対して記録されたオブジェクト名は更新されません。代わりに、これらのオプションは、パスの「変更なしと想定」ビットを設定および設定解除します。 「変更なしと想定」ビットがオンの場合、gitは作業ツリーファイルで可能な変更のチェックを停止するため、作業ツリーファイルを変更したときにgitに通知するにはビットを手動で設定解除する必要があります。

35
Carlos

Gitxを使用すると、個々の行をコミットまたは無視できます(既に知っているかもしれません)が、コミットするたびにそれを行う必要があります。配置ターゲットごとに設定ファイルを用意し(バージョン管理できます)、サーバーを起動しているときの実行時パラメーター(./myserver --config=whatever.js)。

6
Andy Ray

継続 https://stackoverflow.com/a/20574486/4935114@Mikegrepを挿入するpre-commitフックを作成することを提案しました無視したい行のステージングされたファイル。フックは、これらの行がステージングされたかどうかを確認します。その場合、echosは警告であり、exitはコード1であるため、コミットプロセスは続行しません。

@ Mike's answer に触発され、私はおそらく彼のフックの改良版を使用していることに気付きましたautomaticallyresets (-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.singleKeyfalseであると仮定しています。 trueに設定している場合は、警告の直後にechoコマンドから$'\n'を削除します。

4
Doron Behar

これは、 git filters を使用して行う方法です。

  1. Gitattributesファイルを作成/開く:
    • <project root> /。gitattributes(リポジトリにコミットされます)
      OR
    • <project root> /。git/info/attributes(リポジトリにコミットされません)
  2. フィルタリングするファイルを定義する行を追加します:
    • *.rb filter=gitignore、つまり、すべての*.rbファイルに対してgitignoreという名前のフィルターを実行します
  3. 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に感謝します。

3
Kache

コンテンツフィルタードライバーは良い解決策ではありません。この行をgit status/etcから隠すことができるかもしれませんが、実際には無視されていません。値を変更すると、変更が表示されない場合でも作業ディレクトリがダーティとしてマークされます。

本当にこの行をバージョン管理から外したい場合は、コマンドライン引数に変更するか、無視されたインクルードファイルまたはビルドファイルに配置することが唯一の実用的な手段です。

2
patricktokeeffe

これは、ソースの複数の行で発生するものであると推測しています。

ある種の.userbuildconfigファイルを含めて、デフォルトをチェックインするのが最もクリーンだと思います。その後、 Carlosの提案 を使用して、そのファイルのみを変更なしと想定できます。これにより、設定を確認する必要があるファイルへの他の変更が見逃されません。

これにより、プリプロセッサマクロをローカルで調整できます(またはJavaこのようなもの https://stackoverflow.com/a/1813873/1270965 )。

1
johnb003