如何组织多个git存储库,以便将它们全部备份到一起?
随着SVN,我有一个单一的大型资料库,我保存在服务器上,并在几台机器上签出。这是一个非常好的备份系统,可以让我轻松地在任何机器上工作。我可以签出一个特定的项目,提交并更新'主'项目,或者我可以签出整个项目。如何组织多个git存储库,以便将它们全部备份到一起?
现在,我有一堆git仓库,为各种项目,其中几个在github上。我也有我提到的SVN仓库,通过git-svn命令导入。
基本上,我喜欢拥有我所有的代码(不仅仅是项目,而是随机片段和脚本,一些像我的简历,我写的网站,等等)放在一个大的资源库中,我可以很容易地将其克隆到远程机器上,或者使用记忆棒/硬盘作为备份。
问题是,因为它是一个私有存储库,并且git不允许检出某个特定的文件夹(我可以推送到github作为一个单独的项目,但是在master-repo中出现更改,和子回购)
我能使用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
等
所以,问题:你的个人代码和项目如何与git仓库,并保持他们同步和备份?
我会强烈建议不要将无关的数据放在给定的 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 ...
然后,您可以获取/从每个“来源”拉,工作和提交 本地,然后推(“备份”),以这些REM的当你 准备的东西,如OTES(请注意如何将推动相同承诺 和历史给每个遥控器的!):
$ 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
- 但不扔 现有的“本地”的历史了。
注:子模块将包括共享相关 谱系的机制,所以我真的不会考虑他们 一个合适的工具,你正在试图解决的问题。
,我还没有尝试嵌套git仓库,因为我没有遇到我需要的情况。正如我读到的#git channel git似乎因嵌套存储库而感到困惑,即你正试图在git存储库中使用git-init。管理嵌套git结构的唯一方法是使用git-submodule
或Android的repo
实用程序。
至于你描述该备份的责任我说委托它...对我来说,我通常把“起源”信息库为每个项目在网络驱动器在一个由IT-定期备份工作技术人员通过他们的备选策略选择。这很简单,我不必担心它。 ;)
我想要添加到Damien's answer他建议:
$ for remote in origin github memorystick; do git push $remote; done
您可以建立一个特殊的远程推送到所有命令1个人实际遥控器;我发现它在http://marc.info/?l=git&m=116231242118202&w=2:
所以对于“混帐推”(下才有 意义 多次推同一分支),你实际上可以做 我做什么:
。GIT中/配置包含:
[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
将推动 “主” 分支到那些远程仓库的两个
。
您也可以保存自己键入的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仓库中,隐藏包含嵌套git仓库的.gitignore中的文件夹。这可以很容易地拥有两个独立的(但嵌套的!)git仓库。
怎么样使用mr一次为您管理多个混帐回购协议:在 集库的
的MR(1)命令可以检出,更新,或执行其他操作,就好像它们是一个组合程序存储库。它可以支持任何Subversion,git,cvs,mercurial,bzr,darcs,cvs,vcsh,化石和真实性库的组合,并且支持其他版本的控制系统可以很容易地添加。 [...]
这是通过简单的shell脚本极其可配置的。事情可以做一些例子 包括:
[...]
- 当更新一个Git仓库,从两个不同的上行流拉和合并两个在一起。
- 并行运行多个存储库更新,大大加快了更新过程。
- 记住由于笔记本电脑处于脱机状态而导致失败的操作,因此可以在重新联机时重试。
,我不断有很多不同的版本库的结束了,写简单的脚本来帮助管理它们让我觉得有东西在GIT中失踪的事实。我只是无法确定它究竟是什么或做什么。 – DonGar 2010-03-18 20:38:26
那么,你也管理很多独立的项目吗?项目和存储库之间的一对一关系在分布式世界中感觉合理,但我仍然会将裸露的存储库安排在公用目录树中以便于备份和管理。 (换句话说,Git/Hg/Bzr迫使您将管理与项目任务分开,而大多数SVN工作流将这两者混为一谈;现在通常会看到人们将管理部分委派给GitHub或其他此类供应商。) – 2010-03-22 10:45:55
此想法仅使感知您是否拥有自己的项目和/或他们是否都是开源的。否则,你将需要在github上,你将需要无限的私人项目,可能会变得昂贵 – dkinzer 2010-10-28 03:11:24