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 addponownym wczytaniu pliku, aby obliczyć obiekt blob git, git uważa, że plik jest inny i pozwala zmianom przejść do zatwierdzenia. Pamiętaj, że git diffzwracaj 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
-necho rozmazywania, ale zgaduję. Czy nie ma ukrytej opcji dla git diff mówiącego, aby ignorowała zakończenia jednej linii?