使用SVN,我有一个大的存储库,我保存在服务器上,并在几台机器上签出.这是一个非常好的备份系统,让我可以轻松地在任何机器上工作.我可以签出一个特定的项目,提交并更新"主"项目,或者我可以检查整个事情.
现在,我有一堆git存储库,用于各种项目,其中一些是在github上.我也有我提到的SVN存储库,通过git-svn命令导入..
基本上,我喜欢把我所有的代码(不仅仅是项目,而是随机的片段和脚本,像我的简历,我写过的文章,我制作的网站等等)放在一个大的存储库中,我可以很容易地克隆到远程机器,或记忆棒/硬盘作为备份.
问题是,因为它是一个私有存储库,并且git不允许检出特定文件夹(我可以将其作为一个单独的项目推送到github,但是更改会出现在master-repo和sub-回购)
我可以使用git子模块系统,但它并不是我想要的行为(子模块是指向其他存储库的指针,并不真正包含实际代码,所以它对备份没用)
目前我有一个git-repos的文件夹(例如,〜/ code_projects/proj1/.git /〜/ code_projects/proj2/.git /),在对proj1进行更改之后git push github
,我将文件复制到〜/ Documents/code/python/projects/proj1 /并做一次提交(而不是单个repos中的众多提交).然后做git push backupdrive1
,git push mymemorystick
等
所以,问题是:你的个人代码和项目如何使用git存储库,并保持同步和备份?
我强烈建议不要在给定的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
但不会抛弃现有的"本地"历史.
注意:子模块是一种包含共享相关 谱系的机制,所以我确实不认为它们是您尝试解决的问题的合适工具.
我想在他推荐的地方添加达米恩的答案:
$ 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 ""] insteadOf =