Git и рабочий процесс С++, как обрабатывать файлы объектов и архивов?

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

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

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

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

Ответ 1

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

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

Здесь взломать, чтобы вы хотели, чтобы вы хотели

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

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 ваших Makefile.

Ответ 2

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

Ответ 3

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

mkdir $BRANCH.d
GIT_INDEX_FILE=$BRANCH.index git --work-tree $BRANCH.d checkout $BRANCH

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

Если скомпилированные исполняемые файлы являются файлами, которые были отмечены в
то 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