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