2010-04-20 8 views
3

Что происходит в this pre-commit hook? Я думал, что изменение файлов приведет к их перестановке.Как это фиксировать привязку для фиксации завершающего пробела?

#!/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 

Я думаю, что идея состоит в том, чтобы удалить конечные пробелы во всех файлах, которые совершает этот штрих.

ответ

2

Ключ для фиксации правильного содержания, то есть:

  • только то, что было стадии (и добавляется к индексу)
  • плюс некоторые модификации, внесенные предварительно фиксации крюка

Первая точка достигается за счет git diff-index

сравнивает содержание и режим O f капли, найденные через древовидный объект с содержимым текущего индекса и, необязательно, игнорируя состояние stat файла на диске.

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

с опцией --cached:

не считают файл на диске, на всех

Любые изменения, принимается во внимание, чтобы быть частью нового коммита ,

Вы можете посмотреть на source of 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); 
+0

Любая модификация * указателя * принимается во внимание, да. Тем не менее, вам все равно нужно «git add» любой файл, который вы изменяете внутри «pre-commit». – sschuberth

3

Кроме того, что это не работает. Я пытался делать следующее в конце моих зафиксироваться крючки:

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

но изменения, сделанные в этих крючках до сих пор не реально получить совершенный (по крайней мере, в мерзавце 1.7.3.4).

Если вы на самом деле хотите, чтобы изменения идти, вы должны явно

git add "$file" 

для каждого файла, который был изменен во время предварительной фиксации фазы.

0

Это можно сделать, но требует сложного сценария.

Здесь вы можете найти эту же проблему. Там он обновляет версию файла на каждом коммите, а не на трещинах. Он полностью работает: https://github.com/addonszz/Galileo/tree/master/githooks

Затем вы просто замените алгоритм замены «Версия файла» на файл «updateVersion.sh» по вашему алгоритму «Trilling Spaces». Возможно, вам нужно изменить несколько вещей, например, удалить ограничение ветки, потому что там сценарий запускается только в том случае, если вы находитесь в ветке разработки.

Кроме того, он будет только изменять файл, если он поставлен. Если файл не поставлен, он ничего не сделает. Точнее, он печатает, что он делает на каждом шагу.