Как объединить двоичный файл?

У меня есть двоичный файл в my_branch, и когда мне нужно внести в него изменения, git, конечно же, не объединит его.

Итак, теперь я делаю следующее:

git checkout my_branch
# make a change to gui.bin
mv gui.bin ~/
git commit -a
mv ~/gui.bin .
git commit -a
# git rebase to 1 commit
git checkout master
git merge my_branch

Но есть ли более простой способ?

Ответы

Ответ 1

Я не совсем уверен, к чему ведет ваш тест. Вы, кажется, двигаете gui.bin в сторону, а затем возвращаете его так, как это было...

Часто двоичные файлы не нужно объединять, вы просто хотите выбрать окончательную версию с того или иного места. Там, где они действительно должны быть объединены, вам нужен либо специальный инструмент слияния, либо использовать какой-то редактор и много ручного вмешательства.

Я заметил, что вы используете commit -a в своем примере. Один из первых шагов, чтобы избежать ненужных конфликтов, - это не передавать какие-либо бинарные файлы, которые могут быть затронуты случайно, если вы не хотите их совершить. Если вы просто git add файлы, которые необходимо зафиксировать и передать без -a, то это поможет. В качестве альтернативы, если есть только один файл, который вы не хотите совершать, вы могли бы add -u и reset перед выполнением фиксации.

git add -u
git reset -- dontcommit.dat
git commit

Когда вы объединяете ветки, которые изменяют двоичный файл, вы можете сохранить одну версию, а не другую. После слияния, где git сообщает вам, что они являются конфликтами в вашем двоичном файле, вы можете сказать git использовать версию в ветке, в которой вы были:

git checkout --ours binary.dat
git add binary.dat

или из ветки, которую вы объединяете следующим образом:

git checkout --theirs binary.dat
git add binary.dat

Ответ 2

вы можете использовать встроенный драйвер слияния binary:

binary: Keep the version from your branch in the work tree, but
leave the path in the conflicted state for the user to sort out.

example.gitattributes line:

*.bin -crlf -diff merge=binary

сообщает git не добавлять окончания строки, а не разграничивать, а также сохранять локальную версию

http://git-scm.com/docs/gitattributes

который сохраняет вашу рабочую копию только...

Другой способ - использовать пользовательский драйвер слияния:

[merge "binmerge"]
  name = my binary merge script
  driver = binmerge.sh %O %A %B

Это может проверить конфликтный файл на список файлов, которые всегда должны быть перезаписаны вашей локальной версией...

использовать драйвер слияния, определить его в конфиге, а затем указать, какие пути он должен использовать в .gitattributes, например:

*.bin -crlf -diff merge=binmerge

binmerge.sh будет вызываться для обработки слияния. он может по существу просто сделать что-то вроде:

#!/bin/sh
echo "Performing merge of binary object ($1, $2, $3)"
touch $2
exit 0