Как организовать несколько репозиториев 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 ответов:
Я сильно советую не помещать несвязанные данные в данный Репозиторий 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.