Возможно ли иметь 2 репозитория git в одном каталоге? Я бы не подумал, но подумал, что спрошу. По сути, я хотел бы проверить файлы конфигурации моего домашнего каталога (например, .emacs), которые должны быть общими для всех машин, на которых я работаю, но иметь второй репозиторий для локальных файлов (например, .emacs.local), который содержит машинно-зависимые конфигурации. Единственный способ, который я могу придумать для этого, - иметь локальную конфигурацию в подкаталоге и игнорировать этот подкаталог из основного репозитория git. Есть другие идеи?
git
git-submodules
git-subrepo
Джо Касадонте
источник
источник
git subtree
выполнит свою работу.Ответы:
Если я понимаю, что вы делаете, вы можете обрабатывать все это в одном репозитории, используя отдельные ветки для каждой машины и ветку, содержащую ваши общие файлы конфигурации домашнего каталога.
Инициализируйте репо и зафиксируйте в нем общие файлы, возможно, переименовав ветвь MASTER в Common. Затем создайте отдельную ветку оттуда для каждой машины, с которой вы работаете, и зафиксируйте машинно-зависимые файлы в этой ветке. Каждый раз, когда вы меняете свои общие файлы, объединяйте общую ветвь с каждой из ветвей машины и отправляйте ее на другие машины (напишите для этого сценарий, если их много).
Затем на каждой машине проверьте ветку этой машины, которая также будет включать общие файлы конфигурации.
источник
Эта статья освещает это относительно хорошо:
https://github.com/rrrene/gitscm-next/blob/master/app/views/blog/progit/2010-04-11-environment.markdown
В принципе, если вы работаете из командной строки, это проще, чем вы думаете. Предположим, вам нужно 2 репозитория git:
Вы можете настроить их так:
Вы можете добавить файл и зафиксировать его только в одном:
Итак, сначала идут параметры для git, затем команда, а затем параметры команды git. Вы можете легко использовать псевдоним команды git, например:
Таким образом, вы можете выполнить одно или другое, немного меньше печатая, например
gitone commit -m "blah"
.То, что кажется более сложным, игнорируется. Поскольку .gitignore обычно находится в корне проекта, вам нужно будет найти способ переключить и его, не переключая весь корень. Или вы можете использовать .git / info / exclude, но все игнорирования, которые вы выполняете, не будут зафиксированы или отправлены, что может испортить других пользователей. Другие, использующие любое репо, могут отправить .gitignore, что может вызвать конфликты. Мне не ясно, как лучше всего решить эти проблемы.
Если вы предпочитаете инструменты с графическим интерфейсом, такие как TortoiseGit, у вас также будут некоторые проблемы. Вы можете написать небольшой скрипт, который временно переименовывает .gitone или .gittwo в .git, чтобы выполнялись предположения этих инструментов.
источник
alias gitone='git --git-dir=.gitone'
gitone config core.excludesfile gitone.exclude
иgitone add gitone.exclude
. Я сделал сценарий, расширяющий это решение: github.com/capr/multigitgit config --global alias.youralias '!git --git-dir="/d/MyProject/_git"'
тогда такgit youralias status
.gitignore
файлы обычно устанавливаются и забываются, вы можете сделать разные копии для каждого репо, а затем скопировать соответствующую версию в каталог как часть псевдонима. Это относится к другим файлам в корне, которые могут конфликтовать, например,README.md
и.gitattributes
.Взгляните на подмодуль git .
источник
RichiH написал инструмент под названием vcsh - инструмент для управления точечными файлами с использованием поддельных голых репозиториев git для помещения более одного рабочего каталога в $ HOME. Ничего общего с csh AFAIK.
Однако, если у вас было несколько каталогов, альтернативой git-submodules (которые являются болью в лучших обстоятельствах, а использование этого примера не является лучшим из обстоятельств) является gitslave, который оставляет подчиненные репозитории проверенными на кончике ветвь в любое время и не требует трехэтапного процесса для внесения изменений во вспомогательное репо (проверка правильной ветки, внесение и фиксация изменения, затем перейдите в суперпроект и зафиксируйте фиксацию нового подмодуля).
источник
Это возможно с использованием переменной,
GIT_DIR
но есть много предостережений, если вы не знаете, что делаете.источник
Да, возможно, вам нужны подмодули. Другой вариант - разместить вашу рабочую копию в подкаталоге, а затем указать символические ссылки из вашего домашнего каталога на интересующие файлы.
источник
мой предпочтительный метод - использовать репо в подкаталоге и использовать рекурсивные символические ссылки:
где файл ' repo / build ' выглядит так:
Внимание : не используйте git add.
источник
Другой вариант - разместить их в разных папках и создать символические жесткие ссылки из одной папки в другую.
Например, если есть репозитории:
А также:
Вы можете сделать символическую ссылку на папки
FolderA
иFolderB
из Repo1 в Repo2. Для Windows команда для запуска на Repo1 будет следующей:Для файлов в основных репозиториях вам нужно будет создать символическую ссылку на каждый из них, а также добавить их в репозиторий,
.gitignore
чтобы избежать шума, если вы этого не хотите.источник
Отказ от ответственности: это не реклама. Я разработчик предоставленной библиотеки.
Я создал расширение git для обработки случаев, когда вы хотите объединить несколько репозиториев в одну папку. Преимущество библиотеки в том, что она позволяет отслеживать репозитории и конфликты файлов. вы можете найти его на гитхабе . Есть также 2 репозитория примеров, чтобы опробовать его.
источник