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