我已经在GitHub中创建了Template Repository,然后根据模板创建了一些存储库。自创建以来,我想将这些模板中的模板进行更新。
这可能吗?
答案 0 :(得分:5)
我将链接到与 HRK44 相同的位置,但我的答案非常不同。
https://help.github.com/en/articles/creating-a-repository-from-a-template
虽然在同一部分提到了 fork 和模板,但它们是非常不同的。
链接中提到的差异之一是:
<块引用>一个新的分支包含父仓库的整个提交历史,而从模板创建的仓库从一次提交开始。
这基本上意味着您将无法从模板中提取新的更改,因为您的 git 历史记录非常不同并且基于不同的事物。
如果您确实使用了已接受的答案中提到的方法,您将进行非常困难的手动合并,这将导致对从模板收到的所有文件进行更改,即使它们自您第一次创建该存储库以来没有更改来自那个模板。
简而言之,从模板(仅使用 master 分支)创建 repo 的过程与:
git clone template
cd folder
rm -rf .git
git init
git remote add origin <new repo url>
git add .
git commit -m "Initial Commit"
git push -u origin master
从模板创建存储库时没有(令人惊讶地)复制的其他一些内容: (除非 github 稍后修复此问题)
因此,在您的组织中使用它时,请确保在新创建的存储库上设置所有存储库配置。
答案 1 :(得分:1)
在其他存储库上,您必须将此模板存储库添加为远程存储。
git remote add template [URL of your repo]
然后运行git fetch更新更改
git fetch --all
然后可以将另一个分支从新遥控器合并到您当前的分支。
git merge template/[branch to merge]
答案 2 :(得分:1)
@daniel 的 answer 也对我不起作用,因为 @dima 的 answer 中提到了无关的历史问题。我通过执行以下操作实现了所需的功能:
复制要用于创建新存储库的模板存储库的 URL。 (例如:https://github.com//my-template.git)
使用 GitHub Importer 根据模板仓库创建一个新仓库。
这解决了不相关的历史问题,因为它保留了模板存储库的整个提交历史。
您需要使用导入器,因为您无法分叉自己的存储库。如果你想使用其他人的模板库,你可以fork他们的。
然后,将模板存储库添加为远程。
git remote add template https://github.com/<username>/my-template.git
在对模板存储库进行新提交后,您可以获取这些更改。
git fetch template
然后,合并或变基。我建议在公共存储库上合并并在私有存储库上重新定位。
合并
git checkout <branch-to-merge-to>
git merge template/<branch-to-merge>
重新定位
git checkout <branch-to-merge-to>
git rebase upstream/<branch-to-merge>
<块引用>
注意:在变基时,您必须
git push origin <branch-name> --force
为了覆盖远程分支上的旧提交。这就是为什么我建议仅基于私有存储库进行变基。
答案 3 :(得分:0)
基于此链接https://help.github.com/en/articles/creating-a-repository-from-a-template,从模板创建等同于fork(具有一些细微差别)。
所以我想您可以将模板添加为远程模板,然后偶尔获取/合并更改到您的当前仓库中。
答案 4 :(得分:0)
我采用了不同的方法,因为 fetch & merge 并不理想,因为模板和下游项目之间存在大量文件分歧。我只需要同步的公共元素。
让我们说我们在本地有以下文件夹结构:
repos
├── template_repo
└── downstream_repo
1.现在从父文件夹(repos)创建一个 git 补丁:
git diff --no-index --diff-filter=d --output=upstream_changes.patch -- downstream_repo/some_common_path template_repo/some_common_path
注意 - 路径的顺序很重要!downstream_repo 排在第一位! (将此解释为“我们需要对下游存储库进行哪些更改以使其与模板存储库相同”;查看 --name-status
输出,希望它有意义。)
--no-index
选项根据文件系统路径生成 git diff。路径可以是单个文件或文件夹。
--diff-filter=d
将忽略位于下游存储库但不在模板存储库中的任何文件。这仅在区分文件夹路径时适用。
您可以使用 --stat
、--name-status
来查看补丁将包含的内容。
查看生成的补丁。
2.更改到下游存储文件夹并应用补丁
git apply -p2 ../upstream_changes.patch
官方文档中对 -p<n>
选项的解释:
删除前导路径组件(以斜线分隔) 传统的差异路径。例如,使用 -p2,一个针对 a/dir/file 的补丁 将直接应用于文件。默认为 1。
使用 -p2
将从允许补丁应用的差异路径中删除 a/downstream_repo
和 b/template_repo
。
这就是从上述文件夹结构开始的原因。 应用补丁后,您应该熟悉其余的过程。