Ich versuche, einen Clean / Smudge-Filter in Git einzurichten, um Dateien, die Geheimnisse enthalten, automatisch durch den Befehl ansible-vault zu verschlüsseln und zu entschlüsseln .
Die Besonderheit des ansible-vault-Befehls besteht darin, dass er nicht idempotent ist (er erstellt jedes Mal eine andere Binärdatei, wenn er für dieselben Daten aufgerufen wird).
Ich habe mit der auf dieser Blog-Seite vorgeschlagenen Implementierung begonnen . Leider hat es nicht richtig funktioniert, da bei jedem Aufruf von smudge (sei es eine Git-Prüfung oder nur der Git-Status) die geheimen Dateien wie für Git geändert aussehen, auch wenn dies nicht der Fall ist.
Also habe ich mich gefragt, ob git die Binärdatei, die er im Index hat, mit der sauber gefilterten aktuellen Datei vergleichen würde, und ich habe versucht, auf diesen Skripten wie folgt aufzubauen:
#!/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
Der Unterschied besteht darin, dass versucht wird, die aktuelle und die HEAD-Version der (unverschlüsselten) geheimen Dateien im Klartext zu vergleichen, und nur dann, wenn sie sich unterscheiden, ein neues mit ansible-vault verschlüsseltes Binär-Blob ausgegeben wird.
Leider glaubt git nach dieser Änderung weiterhin, dass die geheime Datei immer geändert wird. Auch nachdem git add
die Datei erneut erstellt wurde, sodass der Git-Blob berechnet wird, denkt Git, dass die Datei anders ist, und lässt die Änderung in das Festschreiben übergehen. Beachten Sie, dass git diff
leere Änderungen wie gewünscht zurückgegeben werden.
Als Referenz ist dies Fleck:
#!/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
und das ist 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
Fleck-Echo zu entfernen , aber das ist eine Vermutung. Keine versteckte Option für git diff, um einzelne Zeilenenden zu ignorieren?