node package manager
Love JavaScript? Your insights can make it even better. Take the 2017 JavaScript Ecosystem Survey »



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.


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


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:



npm install --global git-po-merge

Add to ~/.gitconfig:

    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


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 "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.


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

Helpful docs: