Как мне объединить двоичный файл? - PullRequest
15 голосов
/ 19 января 2010

У меня есть двоичный файл в 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

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

Ответы [ 2 ]

21 голосов
/ 19 января 2010

Я не совсем уверен, к чему ведет ваш тестовый пример. Похоже, вы убираете gui.bin с пути, а затем возвращаете его таким, каким он был ...

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

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

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
11 голосов
/ 19 января 2010

вы можете использовать встроенный 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.

пример строки .gitattributes:

*.bin -crlf -diff merge=binary

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...