私はすでにフォローしています
[attr]POFILE merge=merge-po-files
locale/*.po POFILE
で、同じローカリゼーション ファイル (例: ) が並列ブランチで変更された.gitattributes
ときに、ブランチのマージが正しく機能するようにしたいと考えています。locale/en.po
現在、次のマージ ドライバーを使用しています。
#!/bin/bash
# git merge driver for .PO files (gettext localizations)
# Install:
# git config merge.merge-po-files.driver "./bin/merge-po-files %A %O %B"
LOCAL="${1}._LOCAL_"
BASE="${2}._BASE_"
REMOTE="${3}._REMOTE_"
# rename to bit more meaningful filenames to get better conflict results
cp "${1}" "$LOCAL"
cp "${2}" "$BASE"
cp "${3}" "$REMOTE"
# merge files and overwrite local file with the result
msgcat "$LOCAL" "$BASE" "$REMOTE" -o "${1}" || exit 1
# cleanup
rm -f "$LOCAL" "$BASE" "$REMOTE"
# check if merge has conflicts
fgrep -q '#-#-#-#-#' "${1}" && exit 1
# if we get here, merge is successful
exit 0
ただし、msgcat
はあまりにも愚かで、これは真の 3 方向のマージではありません。たとえば、私が持っている場合
ベースバージョン
msgid "foo" msgstr "foo"
ローカル版
msgid "foo" msgstr "bar"
リモートバージョン
msgid "foo" msgstr "foo"
私は紛争で終わるでしょう。ただし、真の 3 方向マージ ドライバは正しいマージを出力します。
msgid "foo"
msgstr "bar"
REMOTE には更新された翻訳が含まれている可能性があるため、単に追加--use-first
することはできないことに注意してください。msgcat
さらに、BASE、LOCAL、および REMOTE がすべて一意である場合でも、競合が必要です。これは実際には競合になるからです。
これを機能させるには、何を変更する必要がありますか? 可能であれば、「#-#-#-#-#」よりも非常識な競合マーカーが少ない場合のボーナス ポイント。