2012-02-24 12 views
16

私は重複を調べましたが、それらの中には同様のタイトルがありますが、私と同じ問題を抱えている人はいません行く。gitプリコミットフックのインデックスにファイルを追加するには

私はpre-commitで実行され、git status --porcelainの出力を使用して、変更されたプロジェクトの任意の低ファイルをコンパイルしました。この部分はうまく動作します。しかし、私は.cssファイルを現在のコミットに含める必要があります。コンパイラの実行に加えて、私のスクリプトはgit add <filename>を実行します。ここで物事が厄介になる場所があります。

ファイルは、インデックスに追加されたですが、現在のコミットのインデックスではありません。したがって、style.lessを変更してgit commit -a(または手動でgit add style.less)を実行すると、コンパイラはstyle.cssstyle.min.cssを生成し、それらを現在のコミットに追加する必要があります。しかし、次のコミットのために2つの.cssファイルがインデックスに追加されているにもかかわらず、私が気づいた動作はstyle.lessだけです。

私の質問は、コミットに影響を与えるように、コミット前のフックでファイルを追加する方法はありますか?プリコミットフックが実行される前に、それらの2つの.cssファイルは変更されていないので、その前にそれらを追加することはできません。また、ゼロ以外のステータスでフックを終了できるので、コミットは取り消されますが、ファイルは追加されますが、回避することを望みます。どんな良いアイデアですか?

答えて

-3

なぜこれを最初にやりたいのですか?あなたは、生成されたファイルをバージョンコントロールに組み込むことを試みています。バージョンコントロールには、とにかくそれほど良いアイデアはありません。チェックアウト時にstyle.min.cssが必要な場合は、ビルドステップでチェックアウトした後に生成できないのはなぜですか?

+0

CSSファイルはバイナリファイルではないので、静的なテキストファイルです。生成されたファイルはバージョン管理には入れられません。通常は、バイナリファイルを解決するための良い方法がない場所ではマージの競合が発生しますが、そのような問題はほとんどないCSSファイルです。私はそれをポストマージ/アップデートするために私たちのウェブサーバ上にLESSコンパイラをインストールする必要はありませんでした。しかし、それは理想的ではありませんでしたが、私がやろうとしていたことを達成するためのより簡単な方法であることが判明しました。 –

+1

これはなぜ受け入れられる答えですか?これは問題を解決しません。 – frhd

+1

私は彼が自分の「あなたのことを間違っている」という無回答を受け入れたと思います。この場合、彼の問題は解決されていると思います。彼が最初にLESSファイルをチェックインしないと、「どうやってそれらをコミットするのか」という問題がなくなります。 – plaugg

0

git属性 'clean'を生成されたファイルを更新するスクリプトにすることができます。通常、フックはスクリプトを実行してソースコードを整理することができますが、生成された出力を "クリーンアップ"するのに使用できると思います。 この属性は、 'git add'を実行したときにトリガされ、生成されたファイルに別の 'git add'を実行させることができます。

+0

あなたはそれについてもっと詳しく説明できますか?私はいくつかのグーグルをして、Gitの属性に関する情報を見つけましたが、スクリプトをどのようにアタッチするか、 'add'アトリビュートをどのようにレイアウトするかについては何も見つかりませんでした。 –

0

最後のコミットの修正を利用することができます。ちょうどアイデア。

+0

私はこのオプションを検討しましたが、避けることを望みます。これは、コミットを実行し、フックを実行し、元のコミットが完了してから、2番目のコミットを実行します(何かが見つからない限り)。これは手作業でやるのが難しく、フックを使って自動的にやります。 –

+0

フックで自動的に実行されても、完璧にジョブが実行されます。 – Xobb

10

問題を再現できません。私の最初の推測では、GIT_INDEX_FILE環境変数があなたのpre-commitフックによって設定解除されていたということでした。しかし、GIT_INDEX_FILEpre-commitから解除しようとすると、別の問題が発生しました(Gitは.git/indexがロックされていると不平を言いました)。

Gitが期待通りに機能し、他の何かが間違っていなければならないことを示すスクリプト例です。このスクリプトは、新しいテスト・リポジトリを初期化し、あなたのフックが何をエミュレートpre-commitフックを作成し、いくつかのテストがコミットます:

#!/bin/sh 

# initialize the test repository 
rm -rf testrepo 
git init testrepo 
cd testrepo 

# create the pre-commit hook 
cat <<\EOF >.git/hooks/pre-commit 
#!/bin/sh 
git status --porcelain | while IFS= read -r line; do 
    # todo: handle renames and deletions of a *.less file 
    f=${line#???} 
    case ${f} in 
     *.less) 
      fb=${f%.less} 
      echo bar >>"${fb}".css 
      echo baz >>"${fb}".min.css 
      git add "${fb}".css "${fb}".min.css 
      ;; 
    esac 
done 
EOF 
chmod +x .git/hooks/pre-commit 

# create foo.less, commit it 
echo foo >foo.less 
git add foo.less 
git commit -m "add foo.less" 

# modify foo.less, commit it 
echo foo2 >>foo.less 
git commit -a -m "modify foo.less" 

テスト・リポジトリにgit log -pを実行し、その結果のコミットを見れば、あなた」 foo.lessが変更されるたびにfoo.cssfoo.min.cssが変更されていることがわかります。

git commit -aが実行される

は、Gitは一時的なインデックスファイルを作成し、代わりにデフォルト.git/indexのコミットを作成することを使用しています。私はあなたの問題がGIT_INDEX_FILE環境変数を設定解除/変更することによって引き起こされたと思った理由を

がここにあります。 git addのような操作がpre-commitフックから機能するように、GitはGIT_INDEX_FILE環境変数を、pre-commitを実行する前に作成した一時インデックスの名前に設定します。あなたのフックがGIT_INDEX_FILEを解除するか、それを.git/indexに設定すると、あなたのフック内のすべてのGit操作は、コミットを生成するために使用される一時インデックスではなく、元のインデックスを変更しようとします。

ただし、一時インデックスファイルは、元のインデックスファイルのロックとしても機能します。フックが元のインデックスを修正しようとしたときに一時インデックスが存在すると、Gitはエラーを返して中断します。

+0

私は実際のリポジトリの実際の動作とは異なり、あなたのスクリプトを実行し、期待どおりに動作しました。もう少し調べてみて、何かを見つけたら戻ってきます。ありがとう! –

+0

私はまだ何が起こっているのか把握することはできませんでしたが、努力のためにあなたに恩恵を与えました。再度、感謝します! –

関連する問題