预备后要做什么?

对于修改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和其他标志如适用),以你的补丁应用到索引以及工作树(手动或自动挂钩)。

    链接地址: http://www.djcxy.com/p/56755.html

    上一篇: What to stage after a pre

    下一篇: Google Places API: json error Uncaught SyntaxError Unexpected token