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

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

12 ответов

Решение

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

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

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

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

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

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

.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, что может вызвать конфликты. Мне не ясно лучший способ решить эти проблемы.

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

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

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

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

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

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

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

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 .'

Да, можно иметь два репозитория git в одном каталоге.

Я предполагаю, что один удаленный репозиторий находится в GitHub, а другой — в GitLab. Я также использую два разных ключа SSH для подключения к этим удаленным репозиториям.

Вы можете иметь оба удаленных репозитория в одном из GitHub/GitLab (и использовать один SSH-ключ) — мало что изменится.

Предварительные требования :

  • Публичные SSH-ключи ( id_ecdsa.pub/ id_rsa.pub/ id_ed25519.pubи т. д.) присутствуют в ваших профилях GitHub и GitLab.

  • Закрытые SSH-ключи ( id_ecdsa/ id_rsa/ id_ed25519и т. д.) добавляются и сохраняются в связке ключей вашей ОС.

  • В файле конфигурации SSH есть ключи, указанные для GitHub и GitLab:

            Host github.com
      Hostname github.com
      AddKeysToAgent yes
      UseKeychain yes
      IdentityFile ~/.ssh/id_ecdsa
    
    Host gitlab.com
      Hostname gitlab.com
      AddKeysToAgent yes
      UseKeychain yes
      IdentityFile ~/.ssh/id_rsa
    

Вот разбивка ответа Криса, имитирующего рабочий процесс :

  • Инициализируйте git в каталоге:

  • Подключить git к одному удаленному репозиторию (расположенному в GitHub)

    git remote add origin git@github.com:your-username/your-repo.git

  • Переименовать во что-то вроде .github

    mv .git .github

  • Инициализируйте git снова

    git init

  • Подключите git к другому удаленному репозиторию (расположенному в GitLab)

    git remote add origin git@gitlab.com:your-username/your-repo.git

  • Переименовать .gitк чему-то вроде .gitlab

    mv .git .gitlab

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

    git --git-dir=.github remote -v

    git --git-dir=.gitlab remote -v

  • Извлечь удаленные (GitHub и GitLab) репозитории

            git --git-dir=.github pull origin main
    git --git-dir=.gitlab pull origin main
    
  • Добавьте файл в оба репозитория

            git --git-dir=.github add README.md
    git --git-dir=.gitlab add README.md
    
  • Написать сообщение фиксации

            git --git-dir=.github commit -m "operational overview"
    git --git-dir=.gitlab commit -m "operational overview"
    
  • Нажмите на удаленный

            git --git-dir=.github push -u origin main
    git --git-dir=.gitlab push -u origin main
    

Единственная дополнительная вещь, которую мы здесь делаем, это использование --git-dirфлаг.

Если вы планируете делать это часто, вы можете добавить псевдоним в файл конфигурации оболочки (например, .zprofile, bashrc, так далее.):

      export github="git --git-dir=.github"
export gitlab="git --git-dir=.gitlab"

Будущие операции, такие как pull, push, add, commitможет быть выполнено как - github pull origin main, gitlab pull origin main, так далее.

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

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

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

  1. Repo1 / FolderA
  2. Repo1 / FolderB

А также:

  1. Repo2 / FolderC

Вы можете символическую ссылку на папки FolderA а также FolderB из Репо1 в Репо2. Для окон команда для запуска на 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 для обработки случаев, когда вы хотите смешать несколько репозиториев в одну папку. Преимущество библиотеки заключается в том, чтобы отслеживать репозитории и конфликты файлов. Вы можете найти его на GitHub. Есть также 2 примера репозиториев, чтобы попробовать это.

OP хочет объединить файлы из нескольких репозиториев в один каталог.

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

      mkdir repo
cd repo
git init
git remote add first https://first/repo.git
git remote add second https://second/repo.git
git fetch first
git fetch second
git checkout first/master -b master

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

Я вижу много ответов, но у меня есть более простое решение:

      git remote rename origin old-origin
git remote add origin git@xxxxxxx.git # your git repository
git push -u origin --all
git push -u origin --tags

И теперь у вас есть два gitа в одном репозитории!

В gitgraken вы увидите эти два git следующим образом:

Другие вопросы по тегам