Github Pages:如何合并两个(分叉的)存储库?
Gihub Pages: How to merge between two (forked) repositories?
我在 Github 页面上托管了一个网站 (example.org)。内容位于我的 "example" 组织的 "production" 存储库的 master
分支中。
- example/production:大师
- => Git example.org
我的个人帐户中还有一个该存储库的分支作为存储库 "staging",我在其中实际创建内容(在分支 master
但也有功能分支)并准备发布的所有内容。它还发布在 Github 页面上(作为 personal.github.io/example.org)
- personal/example.org:master
- (example/production:master 的分支)
- => personal.github.io/example.org
这个有点复杂的设置是必需的,因为存储库只能在一个 URL 下的 Git 中心页面上发布一个分支。要为我正在进行的工作获得另一个公开可用的 URL,我需要在我的个人帐户上有分叉。
为了让它工作,我必须删除我的叉子中的 CNAME
文件(否则它会尝试为同一个域发布,这不起作用,因为它已经在使用中)并且为 Jekyll 更改 _config.yml
文件中的相同值(以便网站内部导航正常,跟踪代码)。
(我不能只将这些文件放入 .gitignore,因为那样它们就不会在存储库中,存储库直接用于 Github 页面...)
当我现在尝试使用 "staging" 的更改在 "production" 上创建拉取请求时,这些对 CNAME
和 _config.yml
的更改也被合并回来 - 破坏 example.org正在处理中。
所以现在我正在挑选从 "staging" 到 "production" 的个人提交 - 这真的很痛苦。
有没有办法让我必须在 "staging" 上完成的这个提交不在合并中?
问题的非解决方案,但解决了如何为 Github 页面上托管的内容提供暂存环境的问题:
不要将 Github 页面(和个人分支回购)用于暂存环境,而是 staging
分支和其他一些 Jekyll 主机,如 Netlify:https://eduardoboucas.com/blog/2017/02/22/jekyll-staging-environment.html
这解决了 CNAME
文件问题(因为它与 Netlify 无关)。
需要更改 _config.yml
,因为 Jekyll 网站模板的设置方式包括样式表、CSS 等({{ site.baseurl }}/public/css/style.css
)并创建内部链接( {{ site.baseurl }}{{ node.url }}
)。这可以使用相对链接或在链接中使用域根来修复(例如 {{ site.baseurl }}/public/css/style.css
变为 /style.css
)。
上述问题的解法分两步:
将 fork 的域从 personal.github.io/example.org
更改为 staging.example.org
这样 CNAME 文件不必删除但必须具有不同的内容,staging.example.org
.
为了能够在两个存储库中拥有不同的文件,同时他们仍然认为它们已完全合并,您必须执行以下操作:
假设我们的 production
存储库和 staging
存储库都在本地签出,现在是相同的(并且具有相同的 CNAME
和 _config.yml
)。查看 staging
,对文件进行更改并提交并推送它们。
如果我们要对 production
进行正常合并,此更改现在将被合并。
但现在我们 运行 这些命令:
git checkout production
git merge --strategy=ours staging
git push production production:master
(Source)
--strategy=ours
确保在此合并期间,production
文件保持不变。但是提交仍然被标记为合并。
如果需要,我们还可以编辑第 2 步和第 3 步之间的提交消息,以更加描述我们刚刚所做的事情:我们合并了两个分支,但保留 "our"(在此case: production
) 文件的版本。
所以对于 git,文件现在已合并,尽管它们实际上保留了它们的内容。只要我们不再触摸它们,这些文件将保持不同但算作 "merged".
我在 Github 页面上托管了一个网站 (example.org)。内容位于我的 "example" 组织的 "production" 存储库的 master
分支中。
- example/production:大师
- => Git example.org
我的个人帐户中还有一个该存储库的分支作为存储库 "staging",我在其中实际创建内容(在分支 master
但也有功能分支)并准备发布的所有内容。它还发布在 Github 页面上(作为 personal.github.io/example.org)
- personal/example.org:master
- (example/production:master 的分支)
- => personal.github.io/example.org
这个有点复杂的设置是必需的,因为存储库只能在一个 URL 下的 Git 中心页面上发布一个分支。要为我正在进行的工作获得另一个公开可用的 URL,我需要在我的个人帐户上有分叉。
为了让它工作,我必须删除我的叉子中的 CNAME
文件(否则它会尝试为同一个域发布,这不起作用,因为它已经在使用中)并且为 Jekyll 更改 _config.yml
文件中的相同值(以便网站内部导航正常,跟踪代码)。
(我不能只将这些文件放入 .gitignore,因为那样它们就不会在存储库中,存储库直接用于 Github 页面...)
当我现在尝试使用 "staging" 的更改在 "production" 上创建拉取请求时,这些对 CNAME
和 _config.yml
的更改也被合并回来 - 破坏 example.org正在处理中。
所以现在我正在挑选从 "staging" 到 "production" 的个人提交 - 这真的很痛苦。
有没有办法让我必须在 "staging" 上完成的这个提交不在合并中?
问题的非解决方案,但解决了如何为 Github 页面上托管的内容提供暂存环境的问题:
不要将 Github 页面(和个人分支回购)用于暂存环境,而是 staging
分支和其他一些 Jekyll 主机,如 Netlify:https://eduardoboucas.com/blog/2017/02/22/jekyll-staging-environment.html
这解决了 CNAME
文件问题(因为它与 Netlify 无关)。
需要更改 _config.yml
,因为 Jekyll 网站模板的设置方式包括样式表、CSS 等({{ site.baseurl }}/public/css/style.css
)并创建内部链接( {{ site.baseurl }}{{ node.url }}
)。这可以使用相对链接或在链接中使用域根来修复(例如 {{ site.baseurl }}/public/css/style.css
变为 /style.css
)。
上述问题的解法分两步:
将 fork 的域从
personal.github.io/example.org
更改为staging.example.org
这样 CNAME 文件不必删除但必须具有不同的内容,staging.example.org
.为了能够在两个存储库中拥有不同的文件,同时他们仍然认为它们已完全合并,您必须执行以下操作:
假设我们的
production
存储库和staging
存储库都在本地签出,现在是相同的(并且具有相同的CNAME
和_config.yml
)。查看staging
,对文件进行更改并提交并推送它们。如果我们要对
production
进行正常合并,此更改现在将被合并。但现在我们 运行 这些命令:
git checkout production git merge --strategy=ours staging git push production production:master
(Source)
--strategy=ours
确保在此合并期间,production
文件保持不变。但是提交仍然被标记为合并。如果需要,我们还可以编辑第 2 步和第 3 步之间的提交消息,以更加描述我们刚刚所做的事情:我们合并了两个分支,但保留 "our"(在此case:
production
) 文件的版本。
所以对于 git,文件现在已合并,尽管它们实际上保留了它们的内容。只要我们不再触摸它们,这些文件将保持不同但算作 "merged".