你如何组织多个git存储库,以便所有这些存储库一起备份?

时间:2008-08-31 13:54:21

标签: git backup

使用SVN,我有一个大的存储库,我保存在服务器上,并在几台机器上签出。这是一个非常好的备份系统,让我可以轻松地在任何机器上工作。我可以签出一个特定的项目,提交并更新“主”项目,或者我可以检查整个项目。

现在,我有一堆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 /并进行一次提交(而不是单个repos中的众多提交)。然后执行git push backupdrive1git push mymemorystick

所以,问题是:你的个人代码和项目如何使用git存储库,并保持同步和备份?

6 个答案:

答案 0 :(得分:74)

我会强烈建议不要将不相关的数据放入给定的数据中 Git存储库。创建新存储库的开销很大 低,这是一个功能,可以保持 不同的血统完全分开。

战斗这个想法意味着结束不必要的纠结历史, 这使管理更加困难 - 更多 重要的是 - “考古学”工具因此而没有用处 稀释。另外,正如你所提到的,Git假定“单位为 克隆“是存储库,实际上必须这样做是因为 它的分布式性质。

一个解决方案是保留每个项目/包/等。作为自己的 在祝福的层次结构下的存储库(即没有工作树) 像:

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

一旦建立了一些公约,它就变得微不足道了 应用管理操作(备份,打包,Web发布) 完整的层次结构,其作用并不完全不同 “单片”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 - 但不会抛出。{ 现存的“本地”历史。

注意:子模块是一种包含共享相关的机制 血统,所以我确实不会认为它们是适合的工具 你想要解决的问题。

答案 1 :(得分:28)

我想添加到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 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会将“主”分支推送到两者
      那些远程存储库。

  •   

您还可以使用结构保存自己输入两次网址:

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

答案 2 :(得分:3)

,我还没有尝试嵌套git存储库,因为我没有遇到过我需要的情况。正如我在#git channel上看到的那样,git似乎因嵌套存储库而感到困惑,即你正试图在git存储库中使用git-init。管理嵌套git结构的唯一方法是使用git-submodule或Android的repo实用程序。

至于你所描述的备份责任我说委托它...对我来说,我通常把每个项目的“origin”存储库放在网络驱动器上,定期备份工作由IT技术人员根据他们选择的备份策略。这很简单,我不必担心。 ;)

答案 3 :(得分:3)

我也对建议的处理方法感到好奇,并将描述我使用的当前设置(使用SVN)。我基本上创建了一个包含迷你文件系统层次结构的存储库,包括它自己的bin和lib目录。在这棵树的根目录中有一个脚本,它将设置你的环境以添加这些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'脚本并在他们的本地拥有所有项目的最新版本查看。他们不必担心安装/更新/ usr / bin或/ usr / lib,并且每次检出都有多个检出和非常本地化的环境。有人也可以整个存储库,而不用担心卸载任何程序。

这对我们来说很好,我不确定我们是否会改变它。这个问题是这个大型存储库中有许多项目。是否有git / Hg / bzr标准方法来创建这样的环境并将项目分解到自己的存储库中?

答案 4 :(得分:2)

如何使用mr一次管理多个Git回购:

  

mr(1)命令可以在a上签出,更新或执行其他操作   一组存储库,好像它们是一个组合的存储库。它   支持subversion,git,cvs,mercurial,bzr的任意组合,   darcs,cvs,vcsh,fossil和veracity repositories,以及对   可以轻松添加其他修订控制系统。 [...]

     

通过简单的shell脚本可以配置它。一些例子   它可以做的事情包括:

     

[...]

     
      
  • 更新git存储库时,从两个不同的上游拉出并将两者合并在一起。
  •   
  • 并行运行多个存储库更新,大大加快了更新过程。
  •   
  • 记住由于笔记本电脑处于脱机状态而失败的操作,因此可以在重新联机时重试这些操作。
  •   

答案 5 :(得分:1)

还有另一种方法可以使用嵌套的git repos,但它并不能解决你遇到的问题。不过,对于那些正在寻找解决方案的人来说,我是:

在顶级git repo中,只需隐藏包含嵌套git repo的.gitignore中的文件夹。这样可以很容易地拥有两个独立的(但嵌套的!)git repos。