Sto cercando di installare il filtro clean / smudge in git per avere la crittografia e la decrittografia automatica dei file contenenti segreti tramite il comando ansible-vault .
La particolarità del comando ansible-vault è che non è idempotente (crea un binario diverso ogni volta che viene invocato sugli stessi dati).
Ho iniziato con l'implementazione suggerita in questa pagina del blog . Sfortunatamente non ha funzionato correttamente, come ogni volta che viene chiamato smudge (sia esso un checkout git, o solo lo stato git), i file segreti sembrano modificati per git, anche se non lo sono.
Quindi mi chiedevo se git avrebbe confrontato il file binario che aveva nell'indice con il file corrente filtrato pulito, e ho provato a costruire su quegli script come segue:
#!/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
La differenza qui è che tenta di confrontare le versioni correnti e HEAD dei file segreti di testo semplice (non crittografati) e solo nel caso in cui differiscano generano un nuovo BLOB binario crittografato con ansible-vault.
Sfortunatamente, dopo questa modifica git continua a pensare che il file segreto sia sempre modificato. Anche dopo aver git addreindirizzato il file, in modo che il blob git sia calcolato, git pensa che il file sia diverso e lascia che la modifica entri nel commit. Si noti che git diffrestituisce modifiche vuote, come dovrebbe.
Per riferimento, questo è sbavatura:
#!/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
e questo è 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
-neco dell'eco, ma è una supposizione. Nessuna opzione nascosta per git diff che gli dice di ignorare le terminazioni a riga singola?