git에서 clean / smudge 필터 를 설정 하여 ansible-vault 명령을 통해 비밀을 포함하는 파일을 자동으로 암호화하고 해독 하려고 합니다.
ansible-vault 명령의 특징은 dem 등성이 아니라는 것입니다 (동일한 데이터에서 호출 될 때마다 다른 바이너리를 작성 함).
이 블로그 페이지 에서 제안 된 구현으로 시작했습니다 . 불행히도 smudge가 호출 될 때마다 (git checkout 또는 git status) 비밀 파일은 git에 대해 수정 된 것처럼 보입니다.
그래서 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
여기서 차이점은 일반 텍스트 (암호화되지 않은) 비밀 파일의 현재 버전과 HEAD 버전을 비교하려고 시도하며 출력이 다른 경우에만 ansible-vault로 암호화 된 새 이진 Blob을 출력한다는 것입니다.
불행히도,이 변경 후에 git은 비밀 파일이 항상 수정되었다고 계속 생각합니다. git add
git blob이 계산되도록 파일을 다시 ing 한 후에도 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
그리고 이것은 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
얼룩 에코에서를 제거하려고 시도 하지만 추측입니다. 단일 행 끝을 무시하도록 지시하는 git diff에 대한 숨겨진 옵션이 없습니까?