GitHub-从模板存储库中提取更改

时间:2019-06-13 09:14:32

标签: github

我已经在GitHub中创建了Template Repository,然后根据模板创建了一些存储库。自创建以来,我想将这些模板中的模板进行更新。

这可能吗?

5 个答案:

答案 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. 存储库配置(允许的合并类型、权限等)
  2. 分支规则

因此,在您的组织中使用它时,请确保在新创建的存储库上设置所有存储库配置。

答案 1 :(得分:1)

在其他存储库上,您必须将此模板存储库添加为远程存储。

git remote add template [URL of your repo]

然后运行git fetch更新更改

git fetch --all

然后可以将另一个分支从新遥控器合并到您当前的分支。

git merge template/[branch to merge]

https://help.github.com/en/articles/adding-a-remote

答案 2 :(得分:1)

@daniel 的 answer 也对我不起作用,因为 @dima 的 answer 中提到了无关的历史问题。我通过执行以下操作实现了所需的功能:

  1. 复制要用于创建新存储库的模板存储库的 URL。 (例如:https://github.com//my-template.git)

  2. 使用 GitHub Importer 根据模板仓库创建一个新仓库。

    这解决了不相关的历史问题,因为它保留了模板存储库的整个提交历史。

    您需要使用导入器,因为您无法分叉自己的存储库。如果你想使用其他人的模板库,你可以fork他们的。

  3. 然后,将模板存储库添加为远程。

    git remote add template https://github.com/<username>/my-template.git
    
  4. 在对模板存储库进行新提交后,您可以获取这些更改。

    git fetch template
    
  5. 然后,合并或变基。我建议在公共存储库上合并并在私有存储库上重新定位。

    合并

    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_repob/template_repo

这就是从上述文件夹结构开始的原因。 应用补丁后,您应该熟悉其余的过程。

所有这些选项在 git diffgit apply 官方文档中都有明确说明。