基于“种子”仓库的项目应采用何种适当的Git工作流程?

19
作为例子:假设您有一个个人项目,比如 Angular Seed(它是 Angular 项目的起点:https://github.com/angular/angular-seed)。
现在您想将其用作某个项目(比如在线照片集)的起点。
您不应该只创建一个分支,因为您不是在制作种子项目的变体。 但如果这是您自己的存储库,github 将不允许您 fork 它。
那么创建一个仍然可以从原始种子项目中拉取更改的克隆的工作流是什么?我认为这就是 fork。

可能是git工作流-使用一个仓库作为另一个仓库的基础的重复问题。 - Evan Carroll
5个回答

28

我刚刚找到了这个回答https://dev59.com/Tm855IYBdhLWcg3w5Igb#4096529以及一条评论(git workflow - using one repo as the basis for another),它们一起给了我一个我喜欢的解决方案。

git clone -o boilerplate ssh://git@github.com/user/proj.git new_proj
参数-o boilerplate将远程分支的名称更改为boilerplate,仍然可以使用该名称来拉取更改。

创建一个新的空白githubnew_proj仓库。 然后
git remote add origin ssh://git@github.com/user/new_proj.git


现在我明白了。为了完整起见,注意你也可以只克隆,然后在克隆中添加新的远程(你的第二个命令),并使用 git remote rm origin 命令删除旧的远程。 - Gary Fixler
2
这是我会做的...虽然通常可以按照正常方式克隆,然后稍后重命名远程源。所以,首先你需要 "git clone https://github.com/xxx/seed.git" 然后 "git remote rename origin seed"。稍后我可以 "git remote add" 一个新的源(例如根据 github.com 的说明)以启用默认推送到我的自己的 repo。这样我就可以始终从 'upstream' 拉取(例如在这里推荐 https://github.com/firebase/angularFire-seed/tree/master)。 - utunga

5
我认为这里的正确答案是使用像Yeoman Generators这样的工具。(http://yeoman.io/)您需要将带有种子项目的git仓库用作生成器。但它不会允许您不断地从种子项目中拉取更改。使用两个远程仓库的解决方案可以运作,但最终,这些项目会分歧越来越大,使得保持这些项目同步非常困难。

我认为我的答案给了我一个更直接的解决方案。虽然我认为向前迈进,使用像Yeoman这样的工具是务实的方法。所以我会把你的标记为正确的。谢谢。 - Mark Bolusmjak
这绝对是比克隆更好的方法,因为您不需要种子仓库的历史记录来污染您的真实更改,也不需要将种子仓库的更改合并到您的仓库中。 - Bill Yang

4
你可以这样做:
  • 初始化一个新的仓库
  • 将你的angular仓库作为该新仓库的子模块进行引用
  • 将该新仓库推送到你的GitHub空间中。
这样,你的新项目就有了:
  • 代表你种子项目(不要修改)的子文件夹
  • 所有特定于你的项目的数据。

我的问题在于种子项目不是一个库。它不会存在于项目的子目录中。当你开始时,它就是整个项目,你需要从这里开始构建。
然后,一个简单的克隆并将其推送回新存储库就足够了。但这样做不会保留您的两个GitHub存储库之间的任何“分叉”关系。您需要通过本地克隆从一个拉取并推送到另一个。

这是我会做的。Seed基本上是一个依赖项,这就是子模块的作用。作为照片相册项目中的子模块,您可以在本地引用它,并管理其存在和位置。此外,如果您(或任何人)更改了seed,您可以分支,在那里拉取最新的seed,针对该版本修复任何失败的测试,并将更新后的用法合并回主线。 - Gary Fixler
@GaryFixler 是的,我经常这样做,当我不想在我的存储库中获得项目的完整副本时,仍然可以引用它。例如:https://github.com/VonC/compileEverything 引用了 https://github.com/Semantic-Org/Semantic-UI - VonC
感谢@VonC。我的问题是种子项目不是一个库。它不在项目的子目录中。当你开始时,它就是项目,你从这里开始构建。 - Mark Bolusmjak
我明白了。我原本以为你只是想克隆到另一个名称 (git clone <url> <newname>),但没有考虑到与原始版本的连接。 - Gary Fixler

3

选项1:克隆/提取/合并

克隆您选择的种子项目的master分支,例如:

$ git clone -o react-starter-kit -b master --single-branch \
      https://github.com/kriasoft/react-starter-kit.git MyApp
$ cd MyApp

沿着这条路,你可以通过运行以下命令从种子项目中拉取和合并更新到你的本地仓库中:
$ git checkout master
$ git fetch react-starter-kit
$ git merge react-starter-kit/master
$ npm install

选项2:克隆 / 拉取 / 差异

克隆种子项目并删除其版本历史记录:

$ git clone https://github.com/kriasoft/react-starter-kit --depth=1
$ git clone https://github.com/kriasoft/react-starter-kit MyApp --depth=1
$ cd MyApp
$ rm -rf .git

然后,每当您需要将种子项目的最新更新拉回到您的本地存储库中时,您可以导航到原始种子项目,拉取更新(git pull),然后使用一些好的Diff工具(例如Beyond Compare)比较该文件夹与您的项目文件夹,并允许您保存和自定义文件夹比较会话。


1
我发现根据这篇文章的模板进行镜像是我唯一可行的方法:
克隆模板并创建新项目:
git clone --mirror https://github.com/mxstbr/react-boilerplate.git
cd react-boilerplate.git
git remote set-url --push origin https://github.com/gitUser/newProject

使用样板文件中的更改更新新项目:

cd react-boilerplate.git
git fetch -p origin
git push --mirror

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