如果存在差异,则使用Git预提交挂钩重新生成文件并拒绝提交

时间:2015-10-07 02:41:43

标签: python git diff githooks git-diff

我的情况(大致类似于)以下内容:

我们有目录结构

my-repo/
  input.txt
  output-1.bin
  output-2.bin
  output-3.bin
  converter.py

为简单起见,我们假设converter.py看起来像这样:

#/usr/bin/env python
from shutil import copyfile
copyfile('input.txt', 'output-1.bin')
copyfile('input.txt', 'output-2.bin')
copyfile('input.txt', 'output-3.bin')

我们版本控制 input.txt output-*.bin。我知道,我知道,你会说没有理由对生成的文件进行版本控制......但在我们的案例中这是不可协商的。我们经常使用.bin文件,它们是关键任务,我们不能冒converter.py搞砸它们的微妙错误。版本控制converter.py脚本输出确保任何脚本更改的后果在git历史记录中都非常明显。

但这导致我们遇到问题。我们可以修改input.txt并提交差异而不运行converter.py来更新.bins!

对于git pre-commit hook来说,这是一个完美的工作。

我们可以通过git diff --cached --name-only --diff-filter=ACM获取已更改文件的列表。如果该列表包含input.txtconverter.py,那么我们希望运行converter.py,然后针对提交的.bin文件区分输出。

所以我有两个问题/问题:

  • 如何在预提交挂钩中运行converter.py,而不会破坏用户在本地结账时可能拥有的任何未提交的更改?这基本上是How do I properly git stash/pop in pre-commit hooks to get a clean working tree for tests?

  • 我怎样才能运行converter.py之后,问问git“工作树中是否存在任何未提交的差异?”我的意思是我希望答案只是git diff,但我不确定git diff在预提交钩子中从执行时究竟是什么意思。

这个问题非常重要的原因是converter.py改变了工作树的状态,而不是仅仅将其输出吐出到stdout。可悲的是,这也是问题的一个不可妥协的公理。

思考?工作代码片段? :)

1 个答案:

答案 0 :(得分:0)

如何将脚本复制到临时位置,在那里运行并将结果与​​repo中的文件进行比较?