Я намагаюся налаштувати фільтр очищення / розмазання в git, щоб мати автоматичне шифрування та розшифрування файлів, що містять секрети через команду ansible-vault .
Своєрідність команди ansible-treult полягає в тому, що вона не є ідентичною (вона створює різний двійковий файл кожного разу, коли вона викликається одними і тими ж даними).
Я почав із реалізації, запропонованої на цій сторінці блогу . На жаль, це не працює належним чином, як і колись викликається розмазування (будь то 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-treult.
На жаль, після цієї зміни git продовжує думати, що секретний файл завжди змінюється. Навіть після git add
повторного користування файлом, щоб обчислити gb 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, який дозволяє йому ігнорувати закінчення в одному рядку?