Usiłuję skonfigurować filtr czyszczenia / rozmazywania w git, aby mieć automatyczne szyfrowanie i deszyfrowanie plików zawierających sekrety za pomocą polecenia ansible-vault .
Osobliwością polecenia ansible-vault jest to, że nie jest idempotentny (tworzy inny plik binarny za każdym razem, gdy jest wywoływany na tych samych danych).
Zacząłem od implementacji sugerowanej na tej stronie bloga . Niestety, nie działało to poprawnie, ponieważ za każdym razem, gdy wywoływana jest smudge (czy to w kasie git, czy po prostu status git), tajne pliki wyglądają jak zmodyfikowane dla git, nawet jeśli tak nie jest.
Zastanawiałem się więc, czy git porównałby plik binarny, który ma w indeksie z czystym, przefiltrowanym plikiem bieżącym, i próbowałem zbudować na tych skryptach w następujący sposób:
#!/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
Różnica polega na tym, że próbuje porównać bieżące i HEAD wersje tajnych plików zwykłego tekstu (niezaszyfrowane) i tylko w przypadku, gdy różnią się, wyjdzie nowy binarny obiekt blob zaszyfrowany za pomocą usługi ansible-vault.
Niestety po tej zmianie git nadal myśli, że tajny plik jest zawsze modyfikowany. Nawet po git add
ponownym wczytaniu pliku, aby obliczyć obiekt blob git, git uważa, że plik jest inny i pozwala zmianom przejść do zatwierdzenia. Pamiętaj, że git diff
zwracaj puste zmiany, tak jak powinno.
Dla porównania jest to smuga:
#!/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
i to jest diff:
#!/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
echo rozmazywania, ale zgaduję. Czy nie ma ukrytej opcji dla git diff mówiącego, aby ignorowała zakończenia jednej linii?