git для Windows: удаление завершающих пробелов при фиксации

#git #githooks #trailing-whitespace

#git #githooks #завершающий пробел

Вопрос:

Я написал pre-commit хук для удаления завершающих пробелов с помощью git для Windows 2.27.0.windows.1. Это похоже на хорошо изученную тему, но, к сожалению, я не могу заставить ее работать должным образом. Это мой .githookspre-commit файл:

 #!/bin/sh
if git rev-parse --verify HEAD >/dev/null 2>amp;1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=$(git hash-object -t tree /dev/null)
fi

git diff --cached --name-only --diff-filter=ACM -z $against | xargs -0 | while read LINE
do 
    if [ -n "$LINE" ]; then
        remove_whitespace "$LINE"
        git add "$LINE"
    fi
done
  

Предположим, у меня уже есть файл test.txt , и в нем нет завершающих пробелов. Теперь я добавляю к нему где-то завершающий пробел, и я хочу pre-commit , чтобы удалить этот пробел и ничего не фиксировать (поскольку изменений не было). Но это то, что происходит:

 C:> git status
On branch test
Your branch is ahead of 'origin/test' by 17 commits.
(use "git push" to publish your local commits)

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
        modified:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")

C:> git commit test.txt -m test
test.txt
[test 30cb9c0] test

C:> git status
On branch test
Your branch is ahead of 'origin/test' by 18 commits.
(use "git push" to publish your local commits)

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
        modified:   test.txt

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
        modified:   test.txt

C:> git add test.txt

C:> git status
On branch test
Your branch is ahead of 'origin/test' by 18 commits.
(use "git push" to publish your local commits)

nothing to commit, working tree clean        
  

Он действительно удалил конечные пробелы test.txt , поскольку, когда я add очищал файл с git add test.txt ним, изменений больше не было. Но pre-commit , похоже, перехват приводит к тому, что файл с завершающими пробелами находится в промежуточной области, а файл без завершающих пробелов еще не подготовлен для фиксации.

Как я могу обработать все файлы, которые должны быть зафиксированы, зафиксировать вывод указанной обработки, но только если это вызвало изменение уже зафиксированной версии?

Комментарии:

1. Почему git diff -z | xargs -0 | while read LINE ? Почему не просто git diff | while read LINE ?

2. В противном случае имена файлов с пробелами вызовут проблемы.

3. Возможно, добавьте -n 1 к xargs аргументам, чтобы убедиться, что он обрабатывает только один файл за раз, поскольку я уверен, что это то, что вы хотите. (Также, для ясности, я бы переименовал $LINE в $FILE . )