我正在編寫一個預先提交的鉤子來運行我的Python測試,並且所有的工作都很好......直到遇到合併衝突。在此合併衝突,一些文檔文件出臺已經尾隨空白每次我嘗試提交的時候,我得到的消息:git reset --hard -q產生有關空白的錯誤
<stdin>:28: trailing whitespace.
Ticket Link:
<stdin>:54: trailing whitespace.
Then visit `http://app.dev`
<stdin>:13528: trailing whitespace.
//most be provided for ALL resource updates, and
<stdin>:13531: trailing whitespace.
"deleted": false, //indicates if this action resulted in a resource delete;
warning: squelched 415 whitespace errors
warning: 420 lines add whitespace errors.
fatal: could not open '.git/MERGE_HEAD' for reading: No such file or directory
,然後當我打開我的編輯寫的提交信息,這是完全空。
我提交前的腳本是:
#!/bin/sh
RED='\033[0;31m'
NC='\033[0m'
proper_pop() {
git reset --hard -q
git stash apply -q --index && git stash drop -q
}
exit_and_pop() {
proper_pop
if [ "$1" -ne 0 ]; then
echo "${RED}Your code failed the pre-commit hook! Please examine the output and fix your issues!${NC}"
fi
exit $1
}
run_and_bail() {
bash -c "$1";
ret=$?;
if [ "${ret}" -ne 0 ]; then
exit_and_pop "${ret}"
fi
}
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
old_stash=$(git rev-parse -q --verify refs/stash)
git stash -q --keep-index
new_stash=$(git rev-parse -q --verify refs/stash)
if [ "$old_stash" = "$new_stash" ]; then
echo "pre-commit script: No changes to test. Not running."
sleep 1 # HACK: Editor may erase message if done too quickly, make the programmer read
exit 0
fi
# If you want to allow non-ASCII filenames set this variable to true.
allownonascii=$(git config --bool hooks.allownonascii)
# Redirect output to stderr.
exec 1>&2
# Cross platform projects tend to avoid non-ASCII filenames; prevent
# them from being added to the repository. We exploit the fact that the
# printable range starts at the space character and ends with tilde.
if [ "$allownonascii" != "true" ] &&
# Note that the use of brackets around a tr range is ok here, (it's
# even required, for portability to Solaris 10's /usr/bin/tr), since
# the square bracket bytes happen to fall in the designated range.
test $(git diff --cached --name-only --diff-filter=A -z $against |
LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
then
cat <<\EOF
Error: Attempt to add a non-ASCII file name.
This can cause problems if you want to work with people on other platforms.
To be portable it is advisable to rename the file.
If you know what you are doing you can disable this check using:
git config hooks.allownonascii true
EOF
exit_and_pop 1
fi
if ! [ -z "$(which git-pylint-commit-hook)" ]; then
run_and_bail "git-pylint-commit-hook"
fi
if ! [ -z "$(which pep8)" ]; then
run_and_bail "python hooks/pep8-hook-check.py"
fi
proper_pop
通過我的調試,我公司生產的最小腳本下重現此錯誤是:
#!/bin/sh
RED='\033[0;31m'
NC='\033[0m'
proper_pop() {
git reset --hard -q
git stash apply -q --index && git stash drop -q
}
exit_and_pop() {
proper_pop
if [ "$1" -ne 0 ]; then
echo "${RED}Your code failed the pre-commit hook! Please examine the output and fix your issues!${NC}"
fi
exit $1
}
run_and_bail() {
bash -c "$1";
ret=$?;
if [ "${ret}" -ne 0 ]; then
exit_and_pop "${ret}"
fi
}
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
old_stash=$(git rev-parse -q --verify refs/stash)
git stash -q --keep-index
new_stash=$(git rev-parse -q --verify refs/stash)
if [ "$old_stash" = "$new_stash" ]; then
echo "pre-commit script: No changes to test. Not running."
sleep 1 # HACK: Editor may erase message if done too quickly, make the programmer read
exit 0
fi
proper_pop
通過這一點,我已經瞭解到,行:git reset --hard -q
在proper_pop
是唯一的罪魁禍首(刪除它刪除錯誤)。沒有安裝其他鉤子,git版本爲:1.8.1.2
,但我也在版本2.5.0
上運行此版本,並且發生同樣的問題。有沒有人有任何想法發生了什麼?
我嘗試管道輸出和錯誤,以/dev/null
爲一個命令,只是爲了看看它是否正常工作,並仍在印刷的錯誤...
它完全是一個問題,我可以解決,它確實沒有按這不會引起任何問題,但我不希望一個技術較低的同事看到這個錯誤並將其拋出(我不確定是否每次我們合併時都會打印這些內容尾隨空格),所以我很想知道發生了什麼以及如何解決這個問題(或者告訴git reset
忽略尾隨空白錯誤)。
編輯:
這是一個完整的工作回購演示此問題:https://github.com/hjc1710/so-git-hook-question,只是遵循README.md
的步驟,你會得到錯誤,無論你是在合併或不。
我的git配置(對於我的工作站,這是在1.8.x,我的筆記本電腦,在2.5.x)可以找到here。敏感信息已被刪除,但沒有一個是相關的。
運行重置 - 硬盤存儲看起來像預先提交的災難配方。在git嘗試做同樣的事情的時候,你放鬆了舞臺並改變了HEAD。另外,如果你在合併過程中進行git重置,你基本上會中止合併。也許不使用預先提交,而是使用分段分支。然後用一個CI系統的工作流程來測試分段和合並,以便爲您掌握。 – Sukima
我試圖看看標準輸入的差異,因爲這是什麼抱怨來自(':28'),但語法似乎並不存在。您是否確認了預安裝鉤子會在乾淨的機器上導致與全新安裝的git相同的問題?運行你的腳本對我來說不會產生任何錯誤,但是這些錯誤看起來讓人聯想到'git rebase --whitespace = warn'這樣的警告。我希望看到你的repo,global和system .gitconfigs('git config -l','git config --global -l','git config --system -l')。 –
Bujiraso
@Bujiraso我已經用我的git configs(我的筆記本電腦上的2.5.x和我的工作站上的1.8.x)編輯了我的原始問題,並使用剝離下鉤和單個文本演示了這個確切問題的示例回購文件。無論您是否在合併中,都會發生錯誤,並且掛鉤只是用索引存儲,並且在沒有索引的情況下正確地掛起。我沒有安裝全新機器的簡易機器,但是如果您想要與他們一起玩,那麼回購中的這些說明應該在100%的時間內觸發錯誤。我有**沒有**的想法,這是得到管道git diff。謝謝! – hjc1710