在Git存储库中分叉文件

时间:2012-07-06 16:50:15

标签: git

我正在开发一个目前具有以下目录布局的R项目:

proj1
  |-- file.r

file.r用于构建特定于项目1的统计模型(因此proj1)。

在开发过程中,我们将为众多项目构建众多模型:

Work
  |-- proj1
  |     └-- file.r
  |-- proj2
  |     └-- file.r
  :
  └-- projn
        └-- file.r

file.r每个项目之间的相似度为90%,但会有差异。我的问题是,有没有办法创建一个主file.r文件并简单地为每个项目分叉?这样,对主服务器的错误修正/增强可以简单地重新定位到forks,特定于文件的更改将简单地应用于顶部。我的第一个想法是使用子模块,但我不确定如何在这里应用它。谢谢!

3 个答案:

答案 0 :(得分:3)

为每个项目使用“主题分支”:

git checkout master
git add file.r ;# this is your master template upon which others are based
git commit -m "Committed the master file"

然后为每个项目:

git checkout -B <project> master ;# create and checkout <project> branch
<hack away on file.r, commit when you want>
git push origin <project> ;# to share <project> with others

因此,在实践中,您最终会使用master,例如project1project2project3等等。应该完全按照自己的意愿行事,并保持理智。

此解决方案优于其他鼓励多个存储库的优势:

  1. 易于管理。你实际上只有一个存储库,最多有20-30个分支?听起来很多,但标签清晰,很容易知道你在哪里,特别是如果你只管理一个小文件集。
  2. 如果你是懒惰的话,很容易分歧(就像我一样)。您可以在两个项目file.rgit diff projectA projectB -- file.r之间看到文件中的差异。您可以对多个存储库执行相同的操作,但它需要像git diff projectA/master projectB/master -- file.r这样的存储库规范。如果您有20-30个项目存储库或使用子模块,可能会感到困惑。
  3. 轻松更新。抓取更新就像发布git fetch origin并观察输出一样简单。
  4. 简单的克隆。设置新的本地存储库时,您将克隆单个远程数据库。不需要克隆原点,然后是git remote add <project>存储库,直到你得到它们为止。
  5. 缺点(不完整的清单):

    1. 此方法依赖于您密切关注已签出的分支机构。关于目录结构的任何内容都不会引起你的注意,因此在任何特定时刻你正在查看的file.r可能并不那么明显。这可能是一个交易破坏者。我不知道。我想这取决于你的工作流程。
    2. 正如KurzedMetal在评论中指出的那样,如果您需要将所有项目合并为一个项目,这可能会变得非常混乱。因此,我不推荐它用于源代码。但是,对于不同的R项目,这可能不太重要。

答案 1 :(得分:3)

IMO实现这一目标的最佳方式是:

  1. 创建一个库和共享代码的回购
  2. 为每个项目创建一个仓库
  3. 使用git submodule将共享代码集成到每个项目
  4. 导入r库并添加项目特定代码。

答案 2 :(得分:0)

其他答案中也描述了一些方法。

例如,

  • 使用面向对象的模式或模板来增加重用并减少代码。
  • 使用git branch
  • 使用git子模块
  • 最后,当没有其他方法时,我在文件头中使用注释,它是另一个文件的分支。

     Date          | Author              | Description
     ------------- | ------------------- | --------------
     05/18/2018    | You                 | Forked from Other/file.r