Как этот хук перед фиксацией исправляет конечные пробелы? - PullRequest
3 голосов
/ 20 апреля 2010

Что происходит в этом хуке предварительной фиксации ?Я думал, что изменение файлов приведет к их перезаписи.

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

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

Ответы [ 3 ]

3 голосов
/ 17 февраля 2011

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

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

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

Если вы действительно хотите, чтобы изменения вступили в силу, вы должны явно

git add "$file"

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

2 голосов
/ 20 апреля 2010

Ключ заключается в том, чтобы зафиксировать правильный контент, а именно:

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

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

Сравнивает содержимое и режим больших двоичных объектов, найденных с помощью объекта дерева, с содержимым текущего индекса и, при необходимости, игнорируя состояние статистики файла на диске.

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);
0 голосов
/ 21 июля 2016

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

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

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

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

...