#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
. )