Tôi đang cố gắng thiết lập bộ lọc sạch / smudge trong git để tự động mã hóa và giải mã các tập tin có chứa các bí mật thông qua lệnh ansible-vault .
Điểm đặc biệt của lệnh ansible-vault là nó không phải là idempotent (nó tạo ra một nhị phân khác nhau mỗi khi nó được gọi trên cùng một dữ liệu).
Tôi bắt đầu với việc thực hiện được đề xuất trong trang blog này . Thật không may, nó không hoạt động chính xác, vì bất cứ khi nào smudge được gọi (có thể là kiểm tra git hoặc chỉ trạng thái git), các tệp bí mật trông như được sửa đổi cho git, ngay cả khi nó không phải là.
Vì vậy, tôi tự hỏi nếu git sẽ so sánh nhị phân anh ta có trong chỉ mục với tệp hiện tại được lọc sạch và tôi đã cố gắng xây dựng trên các tập lệnh như sau:
#!/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
Sự khác biệt ở đây là nó cố gắng so sánh các phiên bản hiện tại và CHÍNH của các tệp bí mật văn bản thuần túy (không được mã hóa) và chỉ trong trường hợp chúng khác nhau xuất ra một blob nhị phân mới được mã hóa với ansible-vault.
Thật không may, sau khi thay đổi này, git tiếp tục nghĩ rằng tập tin bí mật luôn được sửa đổi. Ngay cả sau khi git add
nhập lại tệp, để git blob được tính toán, git nghĩ rằng tệp là khác nhau và để thay đổi đi vào cam kết. Lưu ý rằng git diff
trả lại các thay đổi trống, như nó nên.
Để tham khảo, đây là smudge:
#!/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
và đây là khác:
#!/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
tiếng vang nhoè, nhưng đó là một phỏng đoán. Không có tùy chọn ẩn nào cho git diff bảo nó bỏ qua các kết thúc dòng đơn?