假设should I store generated code in source control的答案为“否”,更改源代码时compare the generated code for changes(预期或意外)的最佳方法是什么?
在这种情况下,
答案 0 :(得分:1)
这是一个Bash脚本,可以比较先前和当前版本之间的单个生成文件:
#!/bin/bash -x
# Compares a generated file between the current revision and an old revision.
#
# XXX We do not use the "-e" Bash option if our intent is merely to
# inspect the changes in generated code, because the "diff" command
# will return "1" if there are changes, terminating this script early.
#
# If, however, our intent is to use this script as a pre-commit hook
# to ensure that the generated code does not change, we should
# enable the "-e" flag and add the "--quiet" option to the diff command
# (which implies the "--exit-code" option, according to the docs).
# XXX Note: the leading "./" to indicate a current-directory-relative path
# is important for the diff command below.
FILENAME=./hellofile.txt
OLD_REVISION=HEAD~
# TODO Replace this with any "build step", e.g. "make <target>"
FILE_PRODUCTION_COMMAND='eval echo "hello $(git rev-parse --short HEAD)" > $FILENAME'
# Stash the entire working tree, including build artifacts
git stash --all
# Produce the modern version of the derived content to be compared
$FILE_PRODUCTION_COMMAND
# Mark the file as something that should be saved in the stash
# The --force command is for in case the file has been marked in the .gitignore file
git add --force $FILENAME
# Preserve the file for later comparison
git stash
# Move to the old version of the source code
git checkout $OLD_REVISION
# Produce the old version of the derived content to be compared
$FILE_PRODUCTION_COMMAND
# Launch a textual or graphical diff viewer to see the changes in the derived content
# We use the "-R" option because we have stashed the newer content.
git diff -R stash@{0}:$FILENAME -- $FILENAME
#git difftool -R stash@{0}:$FILENAME -- $FILENAME
# Discard the most recent stash
git stash drop
# Clean everything, including ignored files; leaves clone totally pristine
git clean -fxd $(git rev-parse --show-toplevel)
# Go back to modern version of the source code
git checkout -
# Restore our original working tree, including build artifacts
git stash pop