我已经有追随者了
[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
太笨了,这不是一个真正的三路合并。
1.基础版本
msgid "foo"
msgstr "foo"
型
1.本地版本
msgid "foo"
msgstr "bar"
型
1.远程版本
msgid "foo"
msgstr "foo"
型
我将以冲突结束。然而,一个真正的三路合并驱动程序将输出正确的合并:
msgid "foo"
msgstr "bar"
型
请注意,我不能简单地将--use-first
添加到msgcat
,因为REMOTE可能包含更新后的翻译。此外,如果BASE、REMOTE和REMOTE都是唯一的,我仍然希望有冲突,因为这确实是一个冲突。
**我需要做什么改变才能使此工作?**如果可能,比'#-#'更少疯狂的冲突标记将获得加分。
6条答案
按热度按时间flmtquvp1#
[This是一个历史版本,请参阅我对2021年版本的合并驱动程序的另一个更新的答案。
这里有一个有点复杂的例子驱动程序,似乎输出正确的合并,其中可能包含一些翻译,应该已被删除的本地或远程版本。
不应该缺少任何东西,所以这个驱动程序只是在某些情况下增加了一些额外的混乱。
这个版本使用了
gettext
原生冲突标记,看起来像#-#-#-#-#
和fuzzy
标志的组合,而不是普通的git冲突标记。这个驱动程序有点难看,无法解决
msgcat
和msguniq
中的bug(或 * 功能 *):字符串
关于这个驱动程序的简短说明:
git merge-file --union
进行合并,合并后,所得单行格式转换回常规PO文件格式。实际的冲突解决是在此之后使用
msguniq
完成的,msgcat
组合原始输入文件生成的模板合并,以恢复可能丢失的元数据。**警告:**此驱动程序将在
.PO
文件上使用msgcat --no-wrap
,如果未指定实际编码,将强制使用UTF-8
编码。如果您想使用这个合并驱动程序,但总是检查结果,请将最后的
exit $MERGESTATUS
更改为exit 1
。从这个驱动程序中获取合并冲突后,修复冲突的最佳方法是使用
virtaal
打开冲突文件并选择Navigation: Incomplete
。我发现这个UI是一个很好的解决冲突的工具。
wqsoz72f2#
这是2021年的另一个答案。我现在使用以下合并驱动程序,这似乎对我测试的所有情况都能正常工作。我将其存储为
./bin/merge-po-files
在我们的存储库中。字符串
这个变体是基于@mezis在同一个问题中的回答版本,但它有以下改进:
&
运行多个管道,然后使用wait
同步所有并行管道来完成向多个CPU的分发。最终的合并需要顺序代码,因此仅在一个CPU核心上运行。合并速度似乎在给定的.PO输入的1 MB/s左右。--no-wrap --sort-output
。git
选项%P
来传递正确的文件名作为参数。如果合并的文件内容与项目中的另一个文件匹配,则需要使用此选项-在这种情况下,与文件内容SHA-1匹配的旧代码可能会打印错误的文件名。请注意,必须在git config中使用%P
(参见文件开头的文档)。perl
、awk
或sed
来修改甚至阅读gettext文件-只是gettext工具。可选部分使用grep
、tail
和wc
来只显示标准输出中的详细冲突,但不处理输出文件中的真实的数据。#~
开头的行,这些冲突将被悄悄删除,而不是尝试合并此类情况)。非冲突的墓地数据将被保留。wn9m85ua3#
[This是一个历史版本,请参阅我对2021年版本的合并驱动程序的另一个更新的答案。
下面是一个示例驱动程序,它可以在正确的位置使用冲突标记来纠正基于文本的diff。但是,如果发生冲突,
git mergetool
肯定会扰乱结果,所以这并不是很好。如果你想只使用文本编辑器来修复冲突的合并,那么这应该没问题:字符串
关于此驱动程序的简短说明:它将常规PO文件格式转换为单行格式,其中每行都是翻译条目。然后它使用常规
git merge-file
进行合并,合并后所得单行格式转换回常规PO文件格式。**警告:**此驱动程序将在.PO文件上使用msgcat --sort-output
,因此如果您希望PO文件以特定顺序排列,这可能不适合您。wmtdaxz34#
在尝试了许多不处理my issues的脚本后,我写了po3way。
它的工作原理是以一种可以确定性地撤消的方式重新 Package 文件,只需使用
git merge-file
来完成这项工作,这很简单,但它很有效。我只是用它来转发来自法语Python文档翻译的port ~60提交(大约5 k msgids):它工作正常。
roqulrg35#
从Mikko的回答中获得一些灵感,我们为
git-whistles
Ruby gem添加了一个成熟的3路合并。它不依赖于
git-merge
或用Perl重写字符串,只使用Gettext工具操作PO文件。下面是代码(MIT许可):
字符串
vbopmzt16#
我做了a python driver,它可以很好地处理由任何分支删除或引入的键。
以下是它的来源:
字符串