У меня уже есть
[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
слишком тупой и , это не истинный трехсторонний слияние.
Например, если у меня есть
-
версия BASE
msgid "foo" msgstr "foo"
-
ЛОКАЛЬНАЯ версия
msgid "foo" msgstr "bar"
-
УДАЛЕННАЯ версия
msgid "foo" msgstr "foo"
Я столкнулся с конфликтом. Однако истинный трехсторонний драйвер слияния выводит правильное слияние:
msgid "foo"
msgstr "bar"
Обратите внимание, что я не могу просто добавить --use-first
в msgcat
, потому что REMOTE может содержать обновленный перевод. Кроме того, если BASE, LOCAL и REMOTE уникальны, я все равно хочу конфликта, потому что это будет действительно конфликт.
Что мне нужно изменить, чтобы сделать эту работу? Бонусные баллы за менее сумасшедший маркер конфликта, чем если бы это было возможно, # # # # # # # # # #