Merge git-crypted files

git-crypt

Давно искал как получить возможность мерджить файлы, которые зашифрованы git-crypt.

В результате нашел вот такое решение.

Во-первых, добавьте в .gitattributes параметр merge=git-crypt для всех файлов, управляемых git-crypt:

crypt/** filter=git-crypt diff=git-crypt merge=git-crypt

затем добавьте в конец файла .git/config следующее:

[merge "git-crypt"]
    name = A custom merge driver used to merge git-crypted files.
    driver = ./my-merge-tool.sh %O %A %B
    recursive = binary

и, наконец, создать файл в корне repo my-merge-tool.sh содержащий:

ancestor_decrypted="$1__decrypt"
current_decrypted="$2__decrypt"
other_decrypted="$3__decrypt"
echo ""
echo "###########################"
echo "# Git crypt driver called #"
echo "###########################"
echo ""

echo "Decrypting ancestor file..."
cat $1 | git-crypt smudge > "${ancestor_decrypted}"
echo "Decrypting current file..."
cat $2 | git-crypt smudge > "${current_decrypted}"
echo "Decrypting other file..."
cat $3 | git-crypt smudge > "${other_decrypted}"
echo ""

echo "Merging ..."
git merge-file -L "current branch" -L "ancestor branch" -L "other branch" "${current_decrypted}" "${ancestor_decrypted}" "${other_decrypted}"
exit_code=$?
cat "${current_decrypted}" | git-crypt clean > $2

echo "Removing temporary files..."
rm "${other_decrypted}" "${ancestor_decrypted}" "${current_decrypted}"

if [ "$exit_code" -eq "0" ]
then
    echo "@@@ No conflict!"
else
    echo "@@@ You need to solve some conflicts..."
fi

exit $exit_code

и убедитесь, что он выполним:

chmod +x my-merge-tool.sh

Это все, теперь вы можете делать merge, cherry-pick, использовать свой любимый mergetool, как обычно!



Комментарии: