рабочий процесс git и C ++, как работать с объектными и архивными файлами? - PullRequest
12 голосов
/ 17 марта 2009

Я использую git для взаимодействия с SVN-репозиторием. У меня есть несколько веток git для разных проектов, над которыми я работаю.

Теперь, когда я переключаюсь из одной ветви в другую с помощью «git checkout», все скомпилированные исполняемые файлы и объектные файлы из предыдущей ветви все еще там. Я хотел бы видеть, что переключение с ветви A на B приводит к дереву со всеми объектными файлами и двоичными файлами с момента моей последней работы с веткой B.

Есть ли способ справиться с этим без создания нескольких репозиториев git?

Обновление: Я понимаю, что исполняемые файлы и двоичные файлы не должны попадать в репозиторий. Я немного разочарован тем фактом, что все функции ветвления в git для меня бесполезны, так как оказывается, что мне придется клонировать свой прокси-репозиторий git для каждой ветви, которую я хочу запустить. Что-то, что я уже сделал для SVN и надеялся избежать с помощью git. Конечно, мне не нужно это делать, но это приведет к тому, что большую часть времени я буду делать новую марку после переключения между ветками (не весело).

Ответы [ 8 ]

9 голосов
/ 17 марта 2009

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

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

Вот хак, чтобы дать вам, что вы хотите

Поскольку у вас есть отдельные каталоги obj, вы можете изменить ваши Makefiles, чтобы сделать базовое расположение динамическим, используя что-то вроде этого:

OBJBASE = `git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1\//'`
OBJDIR = "$(OBJBASE).obj"
# branch master: OBJBASE == "master/", OBJDIR == "master/.obj"
# non-git checkout: OBJBASE == "", OBJDIR == ".obj"

Это будет имя вашего филиала в OBJBASE, из которого вы можете использовать свое фактическое местоположение objdir. Я оставлю это вам, чтобы изменить его в соответствии с вашей средой и сделать его дружественным для не-git пользователей ваших Makefiles.

6 голосов
/ 17 марта 2009

Это не специфично для git или svn - ваш компилятор и другие инструменты должны направлять вывод промежуточных файлов, таких как .o, в каталоги, которые не контролируются версиями.

5 голосов
/ 11 декабря 2009

Чтобы сохранить несколько проверок одного и того же репо, вы можете использовать git --work-tree. Например,

mkdir $BRANCH.d
GIT_INDEX_FILE=$BRANCH.index git --work-tree $BRANCH.d checkout $BRANCH
3 голосов
/ 18 марта 2009

В каталоге contrib/ дистрибутива git есть скрипт под названием git-new-workdir, который позволяет извлекать несколько веток в разных каталогах без клонирования вашего хранилища.

3 голосов
/ 17 марта 2009

Вы можете настроить свой IDE-компилятор на генерацию всех личных временных файлов (.class и т. Д.) В <output>\branchName\....

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

Таким образом, даже если личные файлы остаются при git checkout, ваш проект в новой ветви готов к работе.

1 голос
/ 17 марта 2009

Эти файлы не отслеживаются Git или Subversion, поэтому они остаются одни, если предположить, что они вам пригодятся.

Я просто делаю свои заказы в разных каталогах. Избавляет меня от необходимости делать уборку.

0 голосов
/ 10 сентября 2010

Если скомпилированные исполняемые файлы представляют собой файлы, которые были проверены в
затем git stash решает проблему.

[compile]
git stash save "first branch"
git checkout other_branch
[Fiddle with your code]
[compile]
git stash save "second branch"
git checkout first_branch
git stash apply [whatever index your "first branch" stash has]
# alternatively git stash pop [whatever index...]

Если скомпилированные исполняемые файлы представляют собой файлы, которые не были и не будут проверены в
затем просто добавьте их в .gitignore

0 голосов
/ 15 мая 2009

Сделать make clean не нужно, потому что файлы, которые отличаются в разных ветках, извлекаются с фактической датой !!!

Это означает, что если ваш Makefile верен, то снова компилируются только те объектные файлы, библиотеки и исполняемые файлы, которые действительно изменились из-за проверки. Именно поэтому, во-первых, и есть make-файл.

Исключение составляют случаи, когда вам нужно переключать параметры компилятора или даже компиляторы в разных ветках. В этом случае, вероятно, git-new-workdir - лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...