在Git存储库中fork一个文件

3
我正在进行一个R项目,目前的目录布局如下:
proj1
  |-- file.r
file.r用于构建特定于Project 1(因此是proj1)的统计模型。
在开发过程中,我们将为众多项目构建众多模型:
Work
  |-- proj1
  |     └-- file.r
  |-- proj2
  |     └-- file.r
  :
  └-- projn
        └-- file.r
file.r在每个项目之间将有90%的相似性,但也会有不同之处。我的问题是,是否有一种方法创建主文件file.r,并简单地将其分支到每个项目中?这样,对主文件的错误修复/增强功能可以简单地向下合并到分支,并且文件特定的更改将被简单地应用在顶部。我的第一个想法是使用子模块,但我不确定如何在这里应用它。谢谢!

通常情况下,您需要将各个项目目录作为单独的存储库(可以是彼此的分支)来处理。 - Amber
3个回答

3

我认为最好的实现方法是:

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

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等都是基于master。这样做应该正是您想要的,并且使所有内容都很清晰明了。
与鼓励多个存储库的其他解决方案相比,此解决方案的优点包括:
  1. 易于管理。您只有一个存储库,在实践中,最多有20-30个分支?听起来很多,但通过清晰的标签,很容易知道您在哪里,特别是如果您只管理少量文件集。
  2. 如果您懒得打补丁,可以轻松进行区分。您可以使用git diff projectA projectB -- file.r查看两个项目之间file.r文件的差异。您也可以使用多个存储库执行相同的操作,但需要指定存储库,例如git diff projectA/master projectB/master -- file.r。如果您有20-30个项目存储库或使用子模块,可能会变得混乱。
  3. 轻松更新。抓取更新就像发出git fetch origin并观察输出一样简单。
  4. 轻松克隆。在设置新的本地存储库时,您只需克隆一个远程存储库。无需克隆原始存储库,然后添加git remote add <project>存储库,直到您获得它们所有。
不足之处(不完整的列表):
  1. 该方法依赖于您密切关注已检出的分支。目录结构中没有任何关于此的线索,因此您查看的file.r可能并不明显。这可能是个破绽点。我不知道。我想这取决于您的工作流程。
  2. 正如KurzedMetal在评论中指出的那样,如果您需要将所有项目合并为一个项目,这可能会很快变得混乱。因此,我不建议用于源代码。但是,对于不同的R项目,这可能不是很重要。

1
实际上,您可以在每个存储库中都有一个特定的README-ProjX.txt,其中X是项目编号,这样在更改分支时就可以立即看到使用的是哪个。 - eykanal
1
这不是一个坏的做法。如果受管文件的总数较小,那么在实践中这应该运行得相当不错。 - Christopher
第二个缺点:你的项目历史记录会变得一团糟(通过合并所有项目),如果你需要将它们拆分开或者不想让所有开发人员都能访问所有项目,你最终会需要使用 git filter-branch(这非常危险)。 - KurzedMetal
@KruzedMetal - 我的工作假设是他们永远不需要合并它们,但是没错,我会在答案中添加这个。 - Christopher

0

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

例如,

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

     日期          | 作者                | 描述
     ------------- | ------------------- | --------------
     05/18/2018    |                   | 从其他文件/file.r分支
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接