【问题标题】:What is the proper git workflow for basing a project off a 'seed' repo?基于“种子”回购的项目的正确 git 工作流程是什么?
【发布时间】:2013-12-21 06:06:43
【问题描述】:

举个例子:假设你有一个像 Angular Seed 这样的个人项目(这是一个 Angular 项目https://github.com/angular/angular-seed 的起点)。

现在您想将其用作项目的起点(例如在线相册)。

您不应该仅仅创建一个分支,因为您没有对种子项目进行变体。 但是如果是你自己的 repo,github 不会让你 fork 的。

那么创建一个仍然可以从原始种子项目中提取更改的克隆的工作流程是什么?我以为那是叉子。

【问题讨论】:

标签: git github


【解决方案1】:

我刚刚找到了这个答案 https://stackoverflow.com/a/4096529/131227 以及一条评论 (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,它仍可用于从中提取更改。

创建新的空 github new_proj 存储库。 那么
git remote add origin ssh://git@github.com/user/new_proj.git

【讨论】:

  • 现在我明白了。为了完整起见,请注意您也可以只克隆,然后在克隆中添加新的远程(您的第二个命令),并使用 git remote rm origin 删除旧的。
  • 这就是我要做的.. 虽然很容易以正常方式克隆然后重命名远程源。所以,首先你会“git clone github.com/xxx/seed.git”然后是“git remote rename origin seed”。稍后我可以“git remote add”一个新的来源(例如按照 github.com 上的说明)以启用默认推送到我自己的 repo。这样我总是可以从“上游”下拉(推荐,例如在这里。github.com/firebase/angularFire-seed/tree/master
【解决方案2】:

我认为这里的正确答案是使用 Yeoman Generators 之类的东西。 (http://yeoman.io/) 您想将 git 存储库与您的种子项目一起用作生成器。但是,它不允许您不断地从种子项目中提取更改。

使用两个遥控器的解决方案可行,但最终项目会出现足够大的差异,这将使这些项目保持同步非常困难。

【讨论】:

  • 我认为我自己的回答给了我一个更直接的解决方案。尽管我认为使用 Yeoman 之类的东西前进是务实的方法。所以我会把你的标记为正确的。谢谢。
  • 这绝对是比克隆更好的方法,因为您不需要种子存储库的历史来污染您的实际更改,通常也不需要将种子存储库中的更改合并到您的更改。
【解决方案3】:

你可以做的是:

  • 初始化一个新的仓库
  • 将您的角度存储库引用为该新存储库的 submodule
  • 将新的存储库推送到您的 GitHub 空间。

这样,您的新项目有:

  • 代表您的种子项目的子文件夹(您无需修改​​)
  • 您的所有特定于您的项目的数据。

我的问题是种子项目不是图书馆。它不在项目的子目录中。它是你开始时的项目,你从那里开始构建。

然后,您将一个简单的克隆推送回您的新存储库就足够了。
但这不会在您的两个 GitHub 存储库之间保持任何“分叉”关系。
您必须通过 本地 克隆拉出一个并推送到另一个。

【讨论】:

  • 这就是我要做的。种子基本上是一个依赖项,这就是子模块。作为相册项目中的子模块,您可以在本地引用它,并管理它的存在和下落。此外,如果您(或任何人)更改种子,您可以分支,从种子那里提取最新的,修复任何失败的测试,并将更新的使用合并回主线。
  • @GaryFixler 是的,当我不想在我的存储库中获取项目的完整副本时,我一直都这样做,同时仍然能够引用它。例如:github.com/VonC/compileEverything 引用 github.com/Semantic-Org/Semantic-UI
  • 感谢@VonC。我的问题是种子项目不是图书馆。它不在项目的子目录中。它是你开始时的项目,你从那里开始构建。
  • 我现在明白了。我在想您可能只是想克隆成不同的名称 (git clone <url> <newname>),但没有考虑与原始名称的连接。
【解决方案4】:

选项 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),可以让您保存和自定义文件夹比较会话。

【讨论】:

    【解决方案5】:

    我发现根据this article 镜像样板文件是为我工作的唯一方法:

    克隆样板并创建新项目:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 2021-03-28
      • 2014-05-11
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多