web-dev-qa-db-ja.com

個々の行を無視するようにgitに指示する方法、つまり特定のコード行のgitignore

.gitignoreはファイル全体を無視できますが、コーディング中に特定のコード行を無視する方法はありますか?

プロジェクトに同じデバッグ行を頻繁に繰り返し追加しますが、コミットする前にそれらを削除することを忘れないでください。コードの行をそのままにしておき、gitに無視させたいと思います。

144
Kache

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

  1. Gitattributesファイルを作成/開く:
    • <project root>/.gitattributes(リポジトリにコミットされます)
      または
    • <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に感謝します。

127
Kache

Javaコードの作成でも同様の問題が発生しました。私の解決策は、コミットしたくないコードをマークアップしてから、マークアップを探すプリコミットフックを追加することでした。

#!/bin/bash
#
# This hook will look for code comments marked '//no-commit'
#    - case-insensitive
#    - dash is optional
#    - there may be a space after the //
#
noCommitCount=$(git diff --no-ext-diff --cached | egrep -i --count "(@No|\/\/\s?no[ -]?)commit")
if [ "$noCommitCount" -ne "0" ]; then
   echo "WARNING: You are attempting to commit changes which include a 'no-commit'."
   echo "Please check the following files:"
   git diff --no-ext-diff --cached --name-only -i -G"(@no|\/\/s?no-?)commit" | sed 's/^/   - /'
   echo
   echo "You can ignore this warning by running the commit command with '--no-verify'"
   exit 1
fi
21
Mike