Saya mencoba untuk mensetup filter clean / smudge di git agar enkripsi dan dekripsi file secara otomatis berisi rahasia melalui perintah vault yang dimungkinkan .
Keunikan dari perintah anault-vault adalah bahwa ia tidak idempoten (ini menciptakan biner yang berbeda setiap kali dipanggil pada data yang sama).
Saya mulai dengan implementasi yang disarankan di halaman blog ini . Sayangnya itu tidak berfungsi dengan benar, karena setiap kali noda dipanggil (baik itu checkout git, atau hanya status git), file-file rahasia terlihat dimodifikasi untuk git, bahkan jika tidak.
Jadi saya bertanya-tanya apakah git akan membandingkan biner yang dia miliki dalam indeks dengan file saat ini yang disaring bersih, dan saya mencoba membangun skrip tersebut seperti berikut:
#!/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
Perbedaannya di sini adalah bahwa ia mencoba untuk membandingkan versi saat ini dan HEAD dari file rahasia teks biasa (tidak terenkripsi), dan hanya dalam kasus mereka berbeda menghasilkan gumpalan biner baru dienkripsi dengan kubah yang dimungkinkan.
Sayangnya, setelah perubahan ini git terus berpikir file rahasia selalu dimodifikasi. Bahkan setelah git add
memasukkan file lagi, sehingga git blob dikomputasi, git berpikir file itu berbeda dan biarkan perubahannya masuk ke dalam commit. Perhatikan bahwa git diff
mengembalikan perubahan kosong, sebagaimana mestinya.
Untuk referensi, ini noda:
#!/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
dan ini berbeda:
#!/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
dari gema noda, tapi itu dugaan. Tidak ada opsi tersembunyi untuk git diff yang mengatakannya untuk mengabaikan akhir baris tunggal?