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

StackOverflow https://stackoverflow.com/questions/36862

  •  09-06-2019
  •  | 
  •  

使用 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 存储库保持同步和备份?

有帮助吗?

解决方案

我会 强烈地 建议不要将无关的数据放在给定的GIT存储库中。创建新存储库的开销很低,这是 特征 这使得将不同的谱系完全分开成为可能。

战斗这个想法意味着最终以不必要的纠结历史,这使行政部门更加困难,并且重要的是 - “考古学”工具由于产生的稀释而降低了有用。另外,正如您提到的那样,GIT假定“克隆单位”是存储库,实际上必须因为其分布性质而这样做。

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

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

一旦建立了一些公约,将管理操作(备份,包装,Web发布)应用于完整的层次结构将变得微不足道,该层次结构与“ Monolithic” 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- 但不会抛弃现有的“本地”历史。

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

其他提示

我想添加到 达米安的回答 他建议:

$ 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:

[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 似乎因嵌套存储库而感到困惑,即你正在尝试在 git 存储库中进行 git-init 。管理嵌套 git 结构的唯一方法是使用 git-submodule 或安卓的 repo 公用事业。

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

使用怎么样 先生 用于同时管理多个 Git 存储库:

MR(1)命令可以在一组存储库上结帐,更新或执行其他操作,就好像它们是一个合并的呼吸器一样。它支持颠覆,git,cvs,mercurial,bzr,darcs,cvs,vcsh,vcsh,化石和真实性存储库的任何组合,并且可以轻松添加对其他修订控制系统的支持。[...]

它可以通过简单的 shell 脚本进行高度配置。它可以做的一些示例包括:

[...]

  • 更新 git 存储库时,从两个不同的上游拉取并将两者合并在一起。
  • 并行运行多个存储库更新,大大加快了更新过程。
  • 记住由于笔记本电脑离线而失败的操作,以便在笔记本电脑恢复在线时可以重试。

还有另一种方法可以嵌套 git 存储库,但它不能解决您所追求的问题。不过,对于其他正在寻找解决方案的人来说,我是:

在顶级 git repo 中,只需隐藏 .gitignore 中包含嵌套 git repo 的文件夹。这使得拥有两个独立(但嵌套!)的 git 存储库变得很容易。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top