/git-po-merge

A git merge driver for .PO files

Primary LanguageShellMIT LicenseMIT

git-po-merge

Build Status npm version

A git merge driver for repos with translations and i18n, the driver helps resolve .po file conflicts when merging or rebasing gettext catalogs.

Install

Git-po-merge requires msgcat, a tool included when installing gettext.

Try:

msgcat --version

If missing and using OSX, gettext is available via homebrew:

brew install gettext
brew link gettext --force

Install and update git config

This can be done one of two ways, globally or per-project/directory:

Globally

Install:

npm install --global git-po-merge

Add to ~/.gitconfig:

[core]
    attributesfile = ~/.gitattributes
[merge "pofile"]
    name = custom merge driver for gettext po files
    driver = git-po-merge %A %O %B

Create ~/.gitattributes:

*.po merge=pofile
*.pot merge=pofile

Single project / directory

Install:

npm install git-po-merge --save-dev

Update git config:

git config merge.pofile.driver "$(npm bin)/git-po-merge %A %O %B"
git config merge.pofile.name "custom merge driver for gettext po files"

Add the same .gitattributes where desired and commit.
Note .gitattributes is only used after committed.

Verify install

git-po-merge  # or $(npm bin)/git-po-merge
> usage: git-po-merge [-s] our.po base.po their.po

touch messages.po
git check-attr -a messages.po
> messages.po: merge: pofile

git-po-merge messages.po messages.po messages.po
> Resolving po conflict with git-merge-po... done.

git merge [some branch with translation changes that conflict]
> Resolving po conflict with git-merge-po... done.
> Resolving po conflict with git-merge-po... done.
> Auto-merging project/locale/fr/LC_MESSAGES/messages.po
> Auto-merging project/locale/es/LC_MESSAGES/messages.po

Notes and caveats

Git only calls the driver in the event of a conflict and will always attempt a traditional 3-way merge first.

The git-merge-po driver will restore messages marked obsolete if the message is active in any po being merged. Good practice is to remake messages after any merge or rebase.

Dev

node --version # using v0.12
npm install --global .
npm link
npm test

Helpful docs:

Thanks: