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


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

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

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

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

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

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

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

6 97

6 ответов:

Я сильно советую не помещать несвязанные данные в данный Репозиторий git. Накладные расходы на создание новых репозиториев довольно низкий, и это характеристика что позволяет сохранить различные линии полностью разделены.

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

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

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

как только несколько конвенций были установлены, это становится тривиальным, чтобы применение административных операций (резервное копирование, упаковка, веб-публикация) к этот полная иерархия, которая выполняет роль, не совсем отличную от "монолитные" хранилища 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

что в основном эквивалентно a svn import--но не бросать существующая, "местная" история в стороне.

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

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

$ 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-адреса дважды с помощью contruction:

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

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

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

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

./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 ' script и имеют самые современные версии всех проектов локально в их оформлении. Им не нужно беспокоиться об установке/обновлении /usr/bin или /usr/lib, и это позволяет легко иметь несколько проверок и очень локализованную среду для каждой проверки. Кто-то может также просто rm весь репозиторий и не беспокоиться об удалении каких-либо программ.

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

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

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

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

[...]

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

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

в верхнем уровне git repo просто спрячьте папку .gitignore, содержащий вложенное РЕПО git. Это позволяет легко иметь два отдельных (но вложенных!) git repos.