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 add
reindirizzato 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 diff
restituisce 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
-n
eco dell'eco, ma è una supposizione. Nessuna opzione nascosta per git diff che gli dice di ignorare le terminazioni a riga singola?