我正在尝试在git中设置清理/涂抹过滤器,以通过ansible-vault命令对包含机密的文件进行自动加密和解密。
ansible-vault命令的特殊之处在于它不是幂等的(每次在同一数据上调用它都会创建一个不同的二进制文件)。
我从此博客页面建议的实现开始。不幸的是,它无法正常工作,因为每当调用smudge(无论是git checkout还是git status)时,秘密文件的git看起来都是经过修改的,即使不是。
所以我想知道git是否会将他在索引中的二进制文件与干净的过滤后的当前文件进行比较,因此我尝试构建如下的脚本:
#!/bin/sh -x
# clean filter, it is invoked with %f
if [ ! -r "$HOME/.vault_password" ]; then
exit 1
fi
tmp=`mktemp`
cat > $tmp
# get the plain text from the binary in the index
tmphead=`mktemp`
git show HEAD:$1 > $tmphead
contenthead=`echo "embedded" | ansible-vault view $tmphead --vault-password-file=$HOME/.vault_password`
export PAGER=cat
echo -n "$contenthead" | tee $tmphead
# if current and index plain text version differ
if [ "`md5sum $tmp | cut -d' ' -f1`" != "`md5sum $tmphead | cut -d' ' -f1`" ]; then
tmpcrypt=`mktemp`
cp $tmp $tmpcrypt
# generate a new crypted blob
echo "embedded" | ansible-vault encrypt $tmpcrypt --vault-password-file=$HOME/.vault_password > /dev/null 2>&1
cat "$tmpcrypt"
else
# just return the HEAD version
cat "$tmphead"
fi
rm $tmp $tmphead $tmpcrypt
此处的区别在于,它尝试比较纯文本(未加密)机密文件的当前版本和HEAD版本,并且只有在它们不同的情况下,才会输出使用ansible-vault加密的新二进制blob。
不幸的是,在进行此更改后,git继续认为秘密文件总是会被修改。即使在git add
再次读取文件后,计算出git blob,git仍认为该文件是不同的,并让更改进入提交。请注意,git diff
返回空更改,应如此。
作为参考,这是污迹:
#!/bin/sh
if [ ! -r "$HOME/.vault_password" ]; then
exit 1
fi
tmp=`mktemp`
cat > $tmp
export PAGER='cat'
CONTENT="`echo "embedded" | ansible-vault view "$tmp" --vault-password-file=$HOME/.vault_password 2> /dev/null`"
if echo "$CONTENT" | grep 'ERROR: data is not encrypted' > /dev/null; then
echo "Looks like one file was commited clear text"
echo "Please fix this before continuing !"
exit 1
else
echo -n "$CONTENT"
fi
rm $tmp
这是差异:
#!/bin/sh
if [ ! -r "$HOME/.vault_password" ]; then
exit 1
fi
export PAGER='cat'
CONTENT=`echo "embedded" | ansible-vault view "$1" --vault-password-file=$HOME/.vault_password 2> /dev/null`
if echo "$CONTENT" | grep 'ERROR: data is not encrypted' > /dev/null; then
cat "$1"
else
echo "$CONTENT"
fi
-n
从污迹回波中删除,但这只是一个猜测。没有git diff的隐藏选项,告诉它忽略单行结尾?