Управление локальными изменениями с помощью git - PullRequest
9 голосов
/ 25 ноября 2011

В моей локальной ветке у меня есть некоторые личные (только локальные) изменения в Makefile (просто меняются пути к компилятору). Очевидно, я не хочу совершать эти изменения, поскольку они имеют отношение только ко мне. Однако, если я не фиксирую их, я получаю сообщение об ошибке при попытке синхронизации с удаленной веткой:

% git fetch upstream
% git merge upstream/master
error: Your local changes to 'Makefile' would be overwritten by merge.  Aborting.
Please, commit your changes or stash them before you can merge.

Копирование и последующее удаление файла каждый раз, когда это происходит, кажется утомительным. Например, в Perforce вы просто переместите эти файлы в отдельный список изменений и при необходимости разрешите конфликты слияния.

Я хочу, чтобы git автоматически объединял мой локальный Makefile с удаленным (где это возможно), но без необходимости его фиксации. Как бы я это сделал?

Ответы [ 3 ]

8 голосов
/ 25 ноября 2011

Существует несколько способов решения этой проблемы, вот моя мысль.

Создайте новую ветку makefix и передайте туда make-файл. Всякий раз, когда вам нужно сделать проект, переключитесь на эту ветку. Вы можете работать в master и просто продолжать слияние или сдвигать ветку makefix к master.

Общая идея заключается в том, что вы создаете ветку, содержащую ваш Makefile, который никогда не выдвигается.

Лично я бы перебазировал makefix против master, поэтому мои Makefile изменения всегда оставались впереди фактического допустимого кода. Это просто чувствует чище в моей голове.

Пример кода

git branch makefix
git checkout makefix

Внесите изменения в Makefile

git add Makefile
git commit -m "Add Local Makefile Changes to Compiler Path"

Для повседневной работы

git checkout master
git fetch upstream
git merge upstream/master

git checkout makefix
git rebase master

Это долго и некрасиво, поэтому я надеюсь, что у кого-то есть лучший способ =]

3 голосов
/ 25 ноября 2011

Вероятно, проще позволить git выполнить перебазирование автоматически, т. Е. Создать локальную ветку, настроить перебазирование, добавить изменения, вытащить ...

git checkout -b mybranch origin/master
git config branch.mybranch.rebase true

Адаптировать Makefile под свои нужды ...

git add Makefile
git commit -m 'My local-only Makefile.'

С этого момента git будет перебазировать ваши изменения после

git pull

В качестве альтернативы (особенно если перебазирование не подходит для вас), вы можете создать копию обычного Makefile для использования иgitignore:

cp Makefile Makefile.local
echo Makefile.local >> .git/info/exclude
make -f Makefile.local

Однако в этом варианте вам нужно следить за (обычным, управляемым git) Makefile и соответствующим образом обновлять вашу локальную версию.

1 голос
/ 11 января 2012

Почему бы не исправить Makefile, чтобы использовать переменную для пути к компилятору вместо чего-то жестко запрограммированного?Тогда вы можете просто установить правильное значение в вашей среде.Многие из них (например, CC для компилятора C, CPP для препроцессора C и т. Д. Предварительно устанавливаются командой make).Если это не так, вы можете присвоить ему значение по умолчанию, которое может быть переопределено переменной среды.В этом примере предполагается, что GNU make, другие утилиты make допускают аналогичные решения:

FOO ?= /usr/bin/foo

test:
        @echo CC is ${CC}
        @echo FOO is ${FOO}

(убедитесь, что используются реальные вкладки).

Это дает:

$ make
CC is cc
FOO is /usr/bin/foo
$ export FOO=/opt/bin/foo
$ make
CC is cc
FOO is /opt/bin/foo
$ make FOO=/just/this/once
CC is cc
FOO is /just/this/once

Thisэто гораздо более удобное решение, позволяющее избежать риска случайного продвижения ваших локальных изменений вверх по течению.

...