Два хранилища git в одном каталоге?

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

Ответ 1

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

Инициализировать репо и передать ему общие файлы, возможно, переименовать ветвь MASTER как Common. Затем создайте отдельную ветку оттуда для каждой машины, с которой вы работаете, и передайте файлы этой машины в эту ветвь. В любое время, когда вы меняете общие файлы, объедините общую ветвь в каждую ветвь машины и нажмите на другие машины (напишите script для этого, если их много).

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

Ответ 2

В этой статье мы рассмотрим это относительно хорошо:

http://git-scm.com/blog/2010/04/11/environment.html

В принципе, если вы работаете из командной строки, это проще, чем вы могли догадаться. Предположим, вы хотите 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. Вы могли бы легко получить псевдоним команды git, например:

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

мой предпочтительный метод использует репо в поддире и использует рекурсивные символические ссылки:

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

где выглядит файл repo/build ':

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

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

Ответ 8

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

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

  • Repo1/FolderA
  • Repo1/FolderB

и

  • Repo2/FolderC

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

[email protected]$ mklink /J FullPath/Repo2/FolderA FullPath/Repo1/FolderA
[email protected]$ mklink /J FullPath/Repo2/FolderB FullPath/Repo1/FolderB
[email protected]$ printf "/FolderA/*\n/FolderB/*\n" >> .gitignore

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

Ответ 9

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

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