我的情况(大致类似于)以下内容:
我们有目录结构
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.txt
或converter.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。可悲的是,这也是问题的一个不可妥协的公理。
思考?工作代码片段? :)
答案 0 :(得分:0)
如何将脚本复制到临时位置,在那里运行并将结果与repo中的文件进行比较?