Как организовать несколько репозиториев git, чтобы все они создавались вместе?

StackOverflow https://stackoverflow.com/questions/36862

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Теперь у меня есть куча репозиториев git для различных проектов, несколько из которых находятся на github.У меня также есть репозиторий SVN, о котором я упоминал, импортированный с помощью команды git-svn..

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

Проблема в том, что это частный репозиторий, а git не позволяет выполнять извлечение из определенной папки (которую я мог бы перенести на github как отдельный проект, но изменения отображаются как в главном репозитории, так и в вложенных репозиториях)

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

В настоящее время у меня есть папка git-репозиториев (например, ~/code_projects/proj1/.git/ ~/code_projects/proj2/.git/), и после внесения изменений в proj1 я делаю git push github, затем я копирую файлы в ~/Documents/code/python/projects/proj1/ и делаю один коммит (вместо многочисленных в отдельных репозиториях).Тогда делай git push backupdrive1, git push mymemorystick и т.д.

Итак, вопрос:Как использовать ваш личный код и проекты в репозиториях git, синхронизировать их и создавать резервные копии?

Это было полезно?

Решение

Я бы настоятельно не советовал помещать несвязанные данные в данный Git репозиторий. Затраты на создание новых репозиториев довольно низкий, и это функция , которая позволяет сохранить разные родословные совершенно разные.

Борьба с этой идеей означает в конечном итоге ненужную запутанную историю, что делает администрирование более сложным и - более главное - & Quot; археология & Quot; инструменты менее полезны из-за разведение. Также, как вы упомянули, Git предполагает, что " единица Клонирование & Quot; является хранилищем, и практически должен сделать это из-за его распределенная природа.

Одним из решений является сохранение каждого проекта / пакета / и т. д. как собственный голый хранилище (т.е. без рабочего дерева) в благословенной иерархии, как:

/repos/a.git
/repos/b.git
/repos/c.git

После того, как несколько соглашений были созданы, это становится тривиальным применять административные операции (резервное копирование, упаковка, веб-публикация) к полная иерархия, которая выполняет роль, не полностью отличную от & Quot; монолитный & Quot; SVN репозитории. Работая с этими репозиториями также становится несколько похожим на рабочие процессы SVN, с добавлением, что один может использовать локальные коммиты и ветки:

svn checkout   --> git clone
svn update     --> git pull
svn commit     --> git push

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

$ cd ~/dev
$ git clone /repos/foo.git       # or the one from github, ...
$ cd foo
$ git remote add github ...
$ git remote add memorystick ...

Затем вы можете получить / извлечь из каждого из "источников", работать и фиксировать локально, а затем нажмите («резервное копирование») на каждый из этих пультов, когда вы готовы с чем-то вроде (обратите внимание, что это подталкивает же коммиты и история каждому из пультов!):

$ for remote in origin github memorystick; do git push $remote; done

Самый простой способ превратить существующее рабочее хранилище ~ / dev / foo в такое пустое хранилище, вероятно, будет:

$ cd ~/dev
$ git clone --bare foo /repos/foo.git
$ mv foo foo.old
$ git clone /repos/foo.git

, который в основном эквивалентен svn import , но не выдает существующий, "местный" история прочь.

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

Другие советы

Я хочу добавить к Ответ Дэмиена где он рекомендует:

$ for remote in origin github memorystick; do git push $remote; done

Вы можете настроить специальный пульт дистанционного управления для подключения ко всем отдельным реальным пультам дистанционного управления с помощью 1 команды;Я нашел это в http://marc.info/?l=git&m=116231242118202&w=2:

Итак, для "git push" (где имеет смысл нажимать одни и те же ветки несколько раз), вы действительно можете делать то, что я делаю:

  • .git/config содержит:

    [remote "all"]
    url = master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
    url = login.osdl.org:linux-2.6.git
    
  • и теперь git push all master подтолкнет ветку "master" к и то , и другое
    из этих удаленных репозиториев.

Вы также можете сэкономить на повторном вводе URL-адресов, используя конструкцию:

[url "<actual url base>"]
    insteadOf = <other url base>

Мне также интересно узнать о предлагаемых способах решения этой проблемы и я опишу текущую настройку, которую я использую (с SVN). Я в основном создал хранилище, которое содержит иерархию мини-файловой системы, включая ее собственные каталоги bin и lib. В корне этого дерева есть скрипт, который настроит вашу среду для добавления этих bin, lib и т. Д. ... других каталогов в соответствующие переменные среды. Таким образом, корневой каталог по сути выглядит так:

./bin/            # prepended to $PATH
./lib/            # prepended to $LD_LIBRARY_PATH
./lib/python/     # prepended to $PYTHONPATH
./setup_env.bash  # sets up the environment

Теперь внутри / bin и / lib находятся несколько проектов и соответствующие им библиотеки. Я знаю, что это не стандартный проект, но для кого-то из моей группы очень легко проверить репо, запустить сценарий 'setup_env.bash' и иметь самые свежие версии всех проектов локально в своих проверять, выписываться. Им не нужно беспокоиться об установке / обновлении / usr / bin или / usr / lib, и это позволяет легко иметь несколько проверок и очень локализованную среду для каждой проверки. Кто-то может также просто удалить весь репозиторий и не беспокоиться об удалении каких-либо программ.

Это хорошо работает для нас, и я не уверен, что мы изменим это. Проблема в том, что в этом большом репозитории много проектов. Есть ли в git / Hg / bzr стандартный способ создания такой среды и разбиения проектов на собственные репозитории?

, я еще не пробовал вложить git-репозитории, потому что я не сталкивался с ситуацией, когда мне это нужно. Как я читал в #git channel git, похоже, запутывается, вкладывая репозитории, т.е. вы пытаетесь выполнить git-init внутри репозитория git. Единственный способ управлять вложенной структурой git - это использовать git-submodule или утилита Android repo Android ,

Что касается той ответственности за резервное копирование, которую вы описываете, я говорю делегат это ... Для себя я обычно ставлю " origin " репозиторий для каждого проекта на сетевом диске в работе, который регулярно поддерживается ИТ-специалистами благодаря выбранной ими стратегии резервного копирования. Это просто, и мне не нужно об этом беспокоиться. ;)

Как насчет использования мистер для одновременного управления несколькими репозиториями Git:

Команда mr(1) может извлекать, обновлять или выполнять другие действия с набором репозиториев, как если бы они были одним объединенным репозиторием.Он поддерживает любую комбинацию репозиториев subversion, git, cvs, mercurial, bzr, darcs, cvs, vcsh, fossil и veracity, а также поддержку другие системы контроля версий могут быть легко добавлены.[...]

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

[...]

  • При обновлении репозитория git извлекайте данные из двух разных восходящих потоков и объединяйте их вместе.
  • Запустите несколько обновлений репозитория параллельно, что значительно ускорит процесс обновления.
  • Запомните действия, которые завершились неудачей из-за отключения ноутбука, чтобы их можно было повторить, когда он снова подключится к сети.

Есть еще один способ для вложенных репозиториев git, но он не решает проблему, которую вы ищете. Тем не менее, для тех, кто ищет решение, я был:

В git-репо верхнего уровня просто спрячьте папку в .gitignore, содержащую вложенное git-репо. Это позволяет легко иметь два отдельных (но вложенных!) Репозитория git.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top