简介:
我想让两个(或更多)“开发流”/环境相互跟踪,在两个方向上相互发送更改,而不完全融合 - 同时保留某些关键的、本质的差异?
细节,一个特殊的例子:
这是一个特殊的例子:
哦,28 年来,我一直在控制我的主目录 glew-home 的版本。 RCS、SCCS、许多 RCS 包装器、CVS、SVN、早期 DVCS(如 Monotone 和 Darcs)、bzr、git 和现在的 Mercurial 的短暂实验。目前我主要喜欢使用 Mercurial,尽管我会根据需要跳回 git 或 bzr。
现在,我的主目录在许多系统上都很相似,但并不完全相同。 Cygwin 与工作中的各种 Linux 之间的最大区别。我试图让它们尽可能地相似,但差异会出现,并且经常需要坚持。
这是一个简单的差异示例:在 Cygwin 上,在我个人拥有的笔记本电脑上,~/LOG 是到 ~/LOG.dir/LOG.cygwin.glew-home 的符号链接(symbolic link),而在工作时 ~/LOG 是指向类似 ~/work/LOG.dir/LOG.work 的符号链接(symbolic link)。
原因:任何专有的东西都需要继续发挥作用。 ~/work 是一个单独的存储库,~/work/.hg,不会被推/pull 或以其他方式与我的个人计算机同步。
问题:我想让这些符号链接(symbolic link)(和其他几个文件)保持不同。但我想同步所有其他文件。我在两个地方都改变了我的环境。如果我在工作中对 ~/.emacs 进行了更改,我想将其发送回家,反之亦然。
问:我怎样才能最方便地做到这一点?
在过去糟糕的日子里,我会使用一个通用的存储库,比如一个通用的 CVS 存储库。 CVS 不处理符号链接(symbolic link),但说我有一个脚本可以从存储在 CVS 中的模板生成符号链接(symbolic link)。我会安排 ~/LOG 的符号链接(symbolic link)模板为我的 cygwin-laptop 和工作设置不同的分支。我将创建工作区,其中大多数文件指向其相应 RCS/CVS 存储库的同一分支,而 cygwin-linux 和 work 之间不同的文件会将其相应的分支 check out 到相应的工作区中。
这很有效,尽管维护起来有点痛苦。
我还没有找到使用现代 DVCS(例如 Mercurial(或 Got 或 Bzr))执行此操作的好方法。
这些现代 DVCS 工具执行整个存储库分支,而不是每个文件分支。他们不理解大多数文件相同但仅某些文件不同的两个分支的概念。
当我尝试跟踪两个分支时,我总是以传播本质差异而告终。
有些人建议使用 Makefile。没有吸引力。
我考虑过对 base revs 进行必要的更改,并不断地 rebase。但我不太喜欢 rebase 。
更好的想法表示赞赏。
被子?
最佳答案
在 git 中,你可以维护一个 master
分支,其中包含所有公共(public)文件(可能加上某些默认状态下的不同文件)和 自定义 分支,如 work
或 cygwin
。
当你想做一个应该传播到每台机器的更改时,你可以在 master
中进行。如果你想让某些东西只用于工作/cygwin 机器,你可以在适当的分支中进行。
当你从一台机器上的 master
pull 新的更改时,你只需 git merge master
或者git rebase master
来自那个分支。
你应该使用哪一个是一个偏好问题,结果工作目录是一样的,只是历史不同。使用 merge
,您将始终看到何时使用来自 master
的更改更新了自定义 分支。使用 rebase
看起来所有的定制都从 master 的尖端分支出来,就好像您首先在 master 中完成所有事情然后才提交任何定制。
不幸的是,我不知道其他 DVCS,因为我没有任何使用它们的经验,但是,我相信 git 的这个过程非常简单。
关于git - 我如何让两个 "streams of development"(分支?)相互跟踪,同时以特定方式保持不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11789875/