Skip to content

Instantly share code, notes, and snippets.

@pashamray
Last active September 19, 2025 08:07
Show Gist options
  • Select an option

  • Save pashamray/b0a4146f4ec1682a03fc34f8100ecd8d to your computer and use it in GitHub Desktop.

Select an option

Save pashamray/b0a4146f4ec1682a03fc34f8100ecd8d to your computer and use it in GitHub Desktop.
git merge SOPS (Secrets OPerationS) conflicts
*.encrypted.* merge=sops

Merge git conflicts SOPS (Secrets OPerationS) files

based on https://gist.github.com/twolfson/962b1eb776ce9947a09d4924d91fd8b2/b18db5fbcea4f3dd4632c9df8d94f14b644c1e52

Dependencies

install merge tool

sudo apt install git meld curl

Set git merge driver

set like local script

git config --global merge.sops.driver "~/sops-merge-driver.sh %O %A %B %L %P"

or set like remote script

git config --global merge.sops.driver "curl --silent https://gist.githubusercontent.com/pashamray/b0a4146f4ec1682a03fc34f8100ecd8d/raw/4e695daec31b16308f8ada9849957ae47d3efe97/sops-merge-driver.sh | bash -s -- %O %A %B %L %P"

Set git merge tool

set merge tool

git config --global merge.tool meld
#!/usr/bin/env bash
# Exit on first error and verify variables have been set/passed via CLI
set -e
set -u
#set -x # for debug
# Rename our variables to friendlier equivalents
# https://git-scm.com/docs/gitattributes#_defining_a_custom_merge_driver
ancestor="$1"
current="$2"
other="$3"
conflict_size_marker="$4"
result="$5"
basename=$(basename $result)
tmp=$(mktemp -d)
trap "rm -rf $tmp" EXIT
# Resolve our default mergetool
mergetool="$(git config --get merge.tool)"
if test "$mergetool" = ""; then
echo "No default \`merge.tool\` was set for \`git\`. Please set one via \`git config --set merge.tool <tool>\`" 1>&2
exit 1
fi
# Decrypt our input files
current_decrypted="$tmp/current.$basename"
other_decrypted="$tmp/other.$basename"
result_decrypted="$tmp/result.$basename"
sops decrypt --filename-override "$result" "$ancestor" > "$result_decrypted"
sops decrypt --filename-override "$result" "$current" > "$current_decrypted"
sops decrypt --filename-override "$result" "$other" > "$other_decrypted"
# Use our mergetool
"$mergetool" "$current_decrypted" "$result_decrypted" "$other_decrypted"
# Re-encrypt content
sops encrypt --filename-override "$result" --output "$result" "$result_decrypted"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment