3

What is going on in this pre-commit hook? I thought changing files would cause them to be restaged.

#!/bin/sh
#
# A git hook script to find and fix trailing whitespace
# in your commits. Bypass it with the --no-verify option
# to git-commit
#

if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# Find files with trailing whitespace
for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | sed -r 's/:[0-9]+:.*//' | uniq` ; do
    # Fix them!
    sed -i 's/[[:space:]]*$//' "$FILE"
done

# Now we can commit
exit

I think the idea is to remove trailing whitespace in all files this commit touches.

4

3 に答える 3

3

重要なのは、適切なコンテンツをコミットすることです。つまり、次のとおりです。

  • ステージされた (そしてインデックスに追加された) もののみ
  • さらに、precommit フックによって導入されたいくつかの変更

最初のポイントは、git diff-index

ツリー オブジェクトを介して見つかった BLOB のコンテンツとモードを現在のインデックスのコンテンツと比較し、必要に応じてディスク上のファイルの統計状態を無視します。

exec git diff-index --check --cached $against --

オプションで--cached

ディスク上のファイルをまったく考慮しない

その後、すべての変更が新しいコミットの一部として考慮されます。

commit.cのソースを見ることができます:

static int prepare_to_commit(const char *index_file, const char *prefix,
                 struct wt_status *s)
{
...

    if (!no_verify && run_hook(index_file, "pre-commit", NULL))
        return 0;
...


/*
 * Re-read the index as pre-commit hook could have updated it,
 * and write it out as a tree.  We must do this before we invoke
 * the editor and after we invoke run_status above.
 */
discard_cache();
read_cache_from(index_file);
于 2010-04-20T18:15:19.560 に答える
3

これが機能しないことを除いて。pre-commit フックの最後で次のことを試しました。

exec git diff-index --check --cached $against --

しかし、これらのフックで行われた変更はまだ実際にはコミットされていません (少なくとも git 1.7.3.4 では)。

実際に変更を加えたい場合は、明示的に行う必要があります

git add "$file"

pre-commit フェーズで変更した各ファイルに対して。

于 2011-02-16T22:21:09.287 に答える
0

それは可能ですが、トリッキーなスクリプトが必要です。

ここでは、同じ問題が解決されていることがわかります。そこでは、スペースをトリルするのではなく、コミットごとにファイルバージョンを更新しています。完全に機能しています: https://github.com/addonszz/Galileo/tree/master/githooks

次に、ファイル「updateVersion.sh」の「バージョン ファイルの置換」アルゴリズムを「Trilling Spaces」アルゴリズムに置き換えるだけです。ブランチの制限を削除するなど、いくつかの変更が必要になる場合があります。これは、'develop' ブランチにいる場合にのみスクリプトが実行されるためです。

また、ステージングされている場合、ファイルのみが変更されます。ファイルがステージングされていない場合、何もしません。より正確には、すべてのステップで何をしているかを出力します。

于 2016-07-21T03:27:03.967 に答える