Два репозитория git в одном каталоге?


возможно ли иметь 2 репозитория git в одном каталоге? Я думал, что нет, но решил спросить. В принципе, я хотел бы проверить файлы конфигурации моего домашнего каталога (например .emacs), который должен быть общим для всех машин, на которых я работаю, но иметь второй репозиторий для локальных файлов (например .в Emacs.local), который содержит конфигурации для конкретных машин. Единственный способ, который я могу придумать, это иметь локальную конфигурацию в подкаталоге и игнорировать этот подкаталог из основного git хранилище. Есть еще идеи?

9 64

9 ответов:

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

инициализируйте РЕПО и зафиксируйте в нем общие файлы, возможно, переименовав главную ветвь как общую. Затем создайте отдельную ветвь оттуда для каждой машины, с которой вы работаете, и зафиксируйте файлы, относящиеся к машине, в эту ветвь. Каждый раз, когда вы изменяете свои общие файлы, объедините общая ветвь в каждую из ветвей машины и нажмите на другие машины (напишите сценарий для этого, если их много).

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

эта статья охватывает это относительно хорошо:

https://github.com/rrrene/gitscm-next/blob/master/app/views/blog/progit/2010-04-11-environment.markdown

в принципе, если вы работаете из командной строки, это проще, чем вы могли догадаться. Предположим, вы хотите 2 git repos:

.gitone
.gittwo

вы можете настроить их так:

git init .
mv .git .gitone
git init .
mv .git .gittwo

вы можете добавить файл и зафиксировать его только для одного типа:

git --git-dir=.gitone add test.txt
git --git-dir=.gitone commit -m "Test"

так варианты ЖКТ на первом месте, потом команду, потом команду git варианты. Вы могли бы достаточно легко псевдоним команды git, как:

#!/bin/sh
alias gitone='git --git-dir=.gitone'
alias gittwo='git --git-dir=.gittwo'

таким образом, вы можете совершить один или другой с немного меньшим набором текста, например gitone commit -m "blah".

то, что кажется более сложным, игнорирует. С.gitignore обычно сидит в корне проекта, вам нужно будет найти способ переключить его, не переключая весь корень. Или, вы могли бы использовать .git / info / exclude, но все игнорирует вы выполняете тогда не будет совершено или нажато-что может испортить других пользователей. Другим помощью РЕПО может толкать .gitignore, что может привести к конфликтам. Мне не ясно, как лучше всего решить эти вопросы.

если вы предпочитаете графические инструменты, такие как TortoiseGit, у вас также будут некоторые проблемы. Вы можете написать небольшой скрипт, который переименовывает .житон или .gittwo to .git временно, чтобы предположения этих инструментов были выполнены.

посмотреть git подмодуль.

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

Ричих написал инструмент под названием vcsh который инструмент для управления dotfiles с помощью поддельных голых репозиториев git, чтобы поместить более одного рабочего каталога в $HOME. Ничего общего с хсг, насколько мне известно.

однако, если у вас было несколько каталогов, альтернативой git-подмодулям (которые являются болью в лучших обстоятельствах, и этот пример использования не является лучшим из обстоятельств) является gitslave который оставляет ведомые репозитории проверенными на кончике ветви в все время и не требует трехэтапного процесса для внесения изменений в дочернее РЕПО (проверка на правильную ветвь, внесение и фиксация изменения, а затем переход в суперпроект и фиксация нового подмодуля).

это возможно с помощью переменной GIT_DIR но есть много предостережений, если вы не знаете, что вы делаете.

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

мой предпочтительный способ использует РЕПО в подкаталоге, и использовать рекурсивные символические ссылки:

git clone repo1
cd somerepo
git clone repo2
cd repo2
./build

где 'РЕПО/построить'-файл выглядит так:

#!/bin/bash 
SELF_PATH="$(dirname "$(readlink -f "")" )"  # get current dir 
cd .. && git stash && git clean -f -d ''       # remove previous symlinks
cp -sR "$SELF_PATH"/* ../.                     # create recursive symlinks in root

осторожностью: не используйте ' git add .-

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

например, если есть в репозитории:

  1. Repo1 / FolderA
  2. Repo1 / FolderB

и:

  1. Repo2/FolderC

вы можете символически связать папки FolderA и FolderB от Repo1 в Repo2. Для windows команда для запуска на Repo1 будет быть:

User@Repo1$ mklink /J FullPath/Repo2/FolderA FullPath/Repo1/FolderA
User@Repo1$ mklink /J FullPath/Repo2/FolderB FullPath/Repo1/FolderB
User@Repo1$ printf "/FolderA/*\n/FolderB/*\n" >> .gitignore

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

отказ от ответственности: это не реклама. Я разработчик библиотеки.

Я создал расширение git для обработки случаев, когда вы хотите смешать несколько репозиториев в одну папку. Преимущество lib заключается в том, чтобы отслеживать репозитории и конфликты файлов. вы можете найти его на github. Есть также 2 примера репозиториев, чтобы попробовать его.