Otomatik şifreleme ve ansible tonoz komutu aracılığıyla sırları içeren dosyaların şifresini çözmek için git temiz / bulaşma filtresi kurmaya çalışıyorum .
Ansible tonoz komutunun özelliği, idempotent olmamasıdır (aynı veride her çağrıldığında farklı bir ikili oluşturur).
Bu blog sayfasında önerilen uygulama ile başladım . Ne yazık ki, lekelenme çağrıldığında (bir git kasası veya sadece git durumu olsun), gizli dosyalar gitmemiş olsa bile, git için değiştirilmiş gibi görünüyor.
Bu yüzden git o dizinde sahip ikili ikili temiz filtrelenmiş geçerli dosya ile karşılaştırmak olup olmadığını merak ettim ve ben aşağıdaki gibi bu komut dosyası üzerinde inşa etmeye çalıştı:
#!/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
Buradaki fark, düz metin (şifrelenmemiş) gizli dosyaların mevcut ve HEAD sürümlerini karşılaştırmaya çalışması ve yalnızca farklı olmaları durumunda ansible tonoz ile şifrelenmiş yeni bir ikili blob çıkarmasıdır.
Ne yazık ki, bu değişiklikten sonra git gizli dosyanın her zaman değiştirildiğini düşünmeye devam ediyor. git add
Git blobunun hesaplanması için dosyayı yeniden girdikten sonra bile git, dosyanın farklı olduğunu düşünür ve değişikliğin işleme alınmasına izin verir. git diff
Boş değişiklikleri gerektiği gibi döndürdüğünü unutmayın .
Referans için, bu leke:
#!/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
ve bu farktır:
#!/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
Lekeyi yankıdan çıkarmayı denerdim , ama bu bir tahmin. Git diff için tek satır sonlarını yoksaymasını söyleyen gizli bir seçenek yok mu?