预备后要做什么?
对于修改staged文件的pre-commit钩子,我需要弄清楚在hook运行之后必须进行什么操作。
预提交钩子对应该提交的文件应用一些漂亮的打印。 挂钩执行以下任务:
标有*)的行为是导致下述问题的行为。
完成这些之后,挂钩使用git add $filename
将修改后的文件添加到索引。 这样,整个文件得到了舞台,我不再只能提交修改后的文件的一小部分(即区块)。
当然,我可以git add --no-verify
并绕过钩子,但使用git gui
时该选项不可用。 另外,我希望在文件的上演线上应用漂亮的打印,所以绕过钩子不是我的目标。
有没有办法在应用漂亮打印之后找出需要添加到索引中的内容,以便在运行挂接之后我可以放置正确的内容,而不是整个文件的分段?
编辑1:
虽然David Brigada提供的答案看起来很有希望,但它不起作用: git stash --keep-index
保留了分段更改(这是最好的部分),但是(至少在msysgit上)会将所有更改放入存储区不仅是未分期的)。 这会导致合并冲突,因为分阶段行可能会被修改,所以在弹出存储回WC时会导致合并冲突。
编辑2:
此外,大卫更新的答案导致没有成功,因为git拒绝合并隐藏到一个肮脏的WC。
编辑3:
来自larsks的回答指出了.gitattributes
的用法。 在第一个瞥见中,这似乎是正确的,但我发现它很困惑,签入版本是通过过滤器运行的,而WC与签入版本不同。 至少,这是我的经验,并在Git Book中备有以下评论:
如果您提交这些更改并再次检出文件,则会看到正确替换的关键字
我必须删除文件,然后再次检查它以查看过滤器所应用的更改。 没门! 还有什么提示?
我不确定预先提交的钩子是否适合执行此类工作。 Git有一个过滤机制,允许您通过.gitattributes
将提交/签出过滤器应用于文档; Pro Git Book包含使用此过滤机制将indent
程序自动应用于C源文件的示例。
您可以将尚未提交的更改放入预存脚本中,然后在完成后将其弹出。 --keep-index
选项仅存储未添加到索引中的更改(未运行git add),而--quiet
选项会禁止您创建和销毁存储的通知。
你所描述的方式并不完全是规范的“做到这一点的git方法”,我见过的大多数预先提交的脚本只是检查不正确的样式,然后在提交时发现错误,如果他们发现任何东西。 这样,你没有预先提交的脚本无意中重写了一些文件,因为某些原因它应该有选项卡(例如测试数据)---你可以简单地用--no-verify重新运行提交相信错误应该在那里。
我在这里有一个简单的预先提交脚本。 它几乎只是运行git的diff-index --check的基本测试,但它使用git存储来处理它应该做的更改。
#!/bin/sh
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
git stash save --keep-index --quiet
git diff-index --check --cached $against --
RETVAL=$?
git stash pop --quiet
exit $RETVAL
更新:
如果您尝试将此策略与修改您要提交的内容的脚本一起使用,您将会遇到合并冲突。 我们应该从预提交脚本中取出隐藏弹出窗口,并在提交后脚本中执行显式合并。
#!/bin/sh
git stash save --keep-index --quiet
# Add your script to prettify the code here ...
git add .
现在后提交脚本看起来像这样
#!/bin/sh
git merge stash@{0} -s recursive -Xtheirs
git stash drop --quiet stash@{0}
与theirs
参数的recursive
合并应该保持脚本在可能时做出的改变。
我不是100%确定我明白这个目标,但也许你可以尝试以下方法。 让你的钩子生成一个补丁,而不是将更改写入磁盘。 (你可以使用做到这一点,例如,在Python difflib
模块,或者写一个临时文件,并掏出来diff
。)然后使用git apply
(与--cached
和其他标志如适用),以你的补丁应用到索引以及工作树(手动或自动挂钩)。
上一篇: What to stage after a pre
下一篇: Google Places API: json error Uncaught SyntaxError Unexpected token