关于备份:如何组织多个git存储库,以便将它们全部一起备份?

关于备份:如何组织多个git存储库,以便将它们全部一起备份?

How do you organise multiple git repositories, so that all of them are backed up together?

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

现在,我有一堆用于各种项目的git存储库,其中一些在github上。我也有提到的SVN信息库,通过git-svn命令导入。

基本上,我喜欢将我的所有代码(不仅是项目,还包括随机代码片段和脚本,诸如我的简历,我写的文章,我创建的网站等东西)都放在一个大的存储库中,可以轻松地克隆到远程存储库中机器或记忆棒/硬盘驱动器作为备份。

问题是,由于它是一个私有存储库,而git不允许检出特定文件夹(我可以将pu作为单独的项目推送到github,但更改要同时出现在master-repo和sub-回购)

我可以使用git子模块系统,但它并不能满足我的要求(子模块是指向其他存储库的指针,并且实际上不包含实际代码,因此对备份无用)

当前,我有一个git-repos文件夹(例如?/ code_projects / proj1 / .git /?/ code_projects / proj2 / .git /),对proj1进行更改后,我执行git push github,然后复制文件放入?/ Documents / code / python / projects / proj1 /并执行一次提交(而不是单个存储库中的众多提交)。然后执行git push backupdrive1git push mymemorystick

那么,问题来了:您的个人代码和项目如何使用git存储库,并使其保持同步和备份?


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

与这个想法作斗争意味着最终会陷入不必要的纠结历史,
这使管理变得更加困难,而且-
重要的是,由于
稀释。另外,正如您提到的,Git假设"
克隆"是存储库,实际上由于
它的分布式性质。

一种解决方案是保留每个项目/程序包/等。自己裸露
有福的层次结构下的存储库(即没有工作树),
喜欢:

1
2
3
/repos/a.git
/repos/b.git
/repos/c.git

一旦建立了一些约定,对
将管理操作(备份,打包,Web发布)应用于
完整的层次结构,其作用与
"整体" SVN存储库。也使用这些存储库
变得有点类似于SVN工作流程,另外一个
可以使用本地提交和分支:

1
2
3
svn checkout   --> git clone
svn update     --> git pull
svn commit     --> git push

为了方便起见,每个工作克隆中可以有多个遥控器
多方之间的同步:

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

然后,您可以从每个"源"中获取/拉取,工作并提交
本地,然后在您按下("备份")到每个遥控器
准备好类似的东西(注意如何推送相同的提交
和每个遥控器的历史记录!):

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

转换现有工作资料库~/dev/foo的最简单方法
到这样一个裸仓库中可能是:

1
2
3
4
$ cd ~/dev
$ git clone --bare foo /repos/foo.git
$ mv foo foo.old
$ git clone /repos/foo.git

它主要等效于svn import,但不会抛出
现有的"本地"历史消失了。

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


我想在他建议的地方添加达米恩的答案:

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

您可以设置一个特殊的遥控器,以使用1条命令将其推入所有单独的真实遥控器。我在http://marc.info/?l=git&m=116231242118202&w=2找到了它:

So for"git push" (where it makes
sense to push the same branches
multiple times), you can actually do
what I do:

  • .git/config contains:

    1
    2
    3
    [remote"all"]
    url = master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
    url = login.osdl.org:linux-2.6.git
  • and now git push all master will push the"master" branch to both
    of those remote repositories.

您还可以使用以下结构来节省自己输入URL的次数:

1
2
[url""]
    insteadOf = <other url base>


我也对处理此问题的建议方法感到好奇,并将描述我使用的当前设置(与SVN一起使用)。我基本上已经创建了一个存储库,其中包含一个小型文件系统层次结构,包括其自己的bin和lib dirs。在这棵树的根目录中有一个脚本,该脚本将设置您的环境,以将这些bin,lib等...其他目录添加到适当的环境变量中。因此,根目录实质上如下所示:

1
2
3
4
./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似乎由于嵌套存储库而感到困惑,即您正在尝试在git存储库中进行git-init。管理嵌套git结构的唯一方法是使用git-submodule或Android的repo实用程序。

至于您要描述的备份责任,我要说是委派……对我来说,我通常将每个项目的"原始"存储库都放在工作的网络驱动器上,并由IT技术人员根据其备份策略定期进行备份。选择。这很简单,我不必担心。 ;)


如何使用Mr一次管理多个Git仓库:

The mr(1) command can checkout, update, or perform other actions on a
set of repositories as if they were one combined respository. It
supports any combination of subversion, git, cvs, mercurial, bzr,
darcs, cvs, vcsh, fossil and veracity repositories, and support for
other revision control systems can easily be added. [...]

It is extremely configurable via simple shell scripting. Some examples
of things it can do include:

[...]

  • When updating a git repository, pull from two different upstreams and merge the two together.
  • Run several repository updates in parallel, greatly speeding up the update process.
  • Remember actions that failed due to a laptop being offline, so they can be retried when it comes back online.

还有另一种嵌套git repos的方法,但是它不能解决您所追求的问题。不过,对于正在寻找解决方案的其他人,我仍然是:

在顶层git repo中,只需将包含嵌套git repo的文件夹隐藏在.gitignore中即可。这使得拥有两个单独的(但嵌套的)git仓库很容易。


推荐阅读