6

简短的:

我想让两个(或更多)“开发流”/环境相互跟踪,在两个方向上相互发送变化,而不是完全收敛——同时保留某些关键的、基本的差异?

细节,一个特别的例子:

这是一个特殊的例子:

哦,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 的符号链接,而在工作中 ~/LOG 是指向某些东西的符号链接比如~/work/LOG.dir/LOG.work。

原因:任何专有的东西都需要继续工作。~/work 是一个单独的存储库,~/work/.hg,不会被推/拉或以其他方式与我的个人计算机同步。

问题:我想保持这些符号链接(和其他几个文件)不同。但我想同步所有其他文件。我在这两个地方都改变了我的环境。如果我在工作中对 ~/.emacs 进行更改,我想将其发送回家,反之亦然。

问:我怎样才能最方便地做到这一点?

在过去糟糕的日子里,我会使用一个通用的存储库,比如一个通用的 CVS 存储库。CVS 不处理符号链接,但说我有一个脚本,它从存储在 CVS 中的模板生成符号链接。我会安排 ~/LOG 的符号链接模板为我的 cygwin-laptop 和工作提供不同的分支。我将创建工作区,其中大多数文件指向其相应 RCS/CVS 存储库的同一分支,而 cygwin-linux 和 work 之间不同的文件会将其相应的分支检出到相应的工作区中。

这很有效,尽管维护起来有点痛苦。

我还没有想出用现代 DVCS 来做到这一点的好方法,比如 Mercurial(或 Got,或 Bzr)。

这些现代 DVCS 工具执行整个 repo 分支,而不是每个文件分支。他们不理解两个分支对于大多数文件是相同的但仅在某些文件中不同的概念。

当我尝试跟踪两个分支时,我总是以传播本质差异而告终。

有些人建议使用 Makefile。没有吸引力。

我已经考虑过对基础转速进行基本更改,并不断重新调整基础。但我不喜欢这么多变基。

更好的想法表示赞赏。

被子?

4

1 回答 1

4

在 git 中,您可以维护一个master包含所有公共文件的分支(可能加上某些默认状态下的不同文件)和自定义分支,如workor cygwin

当您想要做出应该传播到每台机器的更改时,您在master. 如果你想让某些东西只在工作/cygwin 机器上运行,你可以在适当的分支中进行。

当您从已签出自定义master分支的机器上提取新更改时,您只需访问该分支或从该分支中​​提取。git merge mastergit rebase master

您应该使用哪一个是一个偏好问题,生成的工作目录是相同的,只是历史记录不同。使用您将始终merge看到您何时使用. 使用它看起来就像所有自定义都从 master 的尖端分支出来,好像您首先在 master 中完成了所有操作,然后才提交任何自定义。masterrebase

不幸的是,我不知道其他 DVCS,因为我对它们没有任何经验,但是,我相信 git 的这个过程非常简单。

于 2012-08-03T06:31:52.813 回答