मैं स्वत: एन्क्रिप्ट और डिक्रिप्ट -वॉल्ट कमांड के माध्यम से युक्त फाइलों को डिक्रिप्ट करने के लिए git में क्लीन / स्मज फिल्टर को सेटअप करने की कोशिश कर रहा हूं ।
Ansible-वॉल्ट कमांड की ख़ासियत यह है कि यह idempotent नहीं है (यह एक ही डेटा पर लागू होने पर प्रत्येक बार एक अलग बाइनरी बनाता है)।
मैंने इस ब्लॉग पृष्ठ में सुझाए गए कार्यान्वयन से शुरू किया । दुर्भाग्य से यह सही ढंग से काम नहीं करता था, जब भी स्मूदी कहा जाता है (यह एक गिट चेकआउट, या सिर्फ गिट स्थिति), गुप्त फ़ाइलों को गिट के लिए संशोधित किया गया दिखता है, भले ही वह ऐसा न हो।
तो मुझे आश्चर्य हुआ कि अगर git उस बाइनरी की तुलना करता है जो कि स्वच्छ फ़िल्टर्ड वर्तमान फ़ाइल के साथ इंडेक्स में है, और मैंने उन स्क्रिप्ट पर इस प्रकार बनाने की कोशिश की:
#!/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
यहाँ अंतर यह है कि यह सादे पाठ के वर्तमान और प्रमुख संस्करणों (अनएन्क्रिप्टेड) गुप्त फाइलों की तुलना करने की कोशिश करता है, और केवल मामले में वे अलग-अलग नए बाइनरी ब्लॉब को ansible-वॉल्ट के साथ एन्क्रिप्टेड आउटपुट करते हैं।
दुर्भाग्य से, इस परिवर्तन के बाद भी यह सोचना जारी है कि गुप्त फ़ाइल को हमेशा संशोधित किया जाता है। git add
फ़ाइल को फिर से इनग करने के बाद भी , ताकि git बूँद की गणना की जाती है, git को लगता है कि फ़ाइल अलग है और परिवर्तन को कमिट में जाने दें। ध्यान दें कि git diff
खाली परिवर्तन लौटें, जैसा कि यह होना चाहिए।
संदर्भ के लिए, यह धब्बा है:
#!/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
और यह अलग है:
#!/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
धब्बा गूंज से हटाने की कोशिश करूँगा , लेकिन यह एक अनुमान है। गिट लाइन के लिए कोई भी छिपा विकल्प यह नहीं बता रहा है कि सिंगल लाइन एंडिंग को अनदेखा करें?