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

ser*_*0ne 7 github

我已经在GitHub中创建了一个模板存储库,然后基于该模板创建了一些存储库。自创建以来,我想将这些模板中的模板进行更新。

这可能吗?

Cer*_*eal 14

如果您想将模板中的更改合并到您的项目中,您将需要从模板中获取所有缺少的提交,并将它们应用到您自己的存储库中。

为此,您需要知道模板化的确切提交 ID,并且需要知道第一次提交的提交 ID。

ORIGINAL_COMMIT_ID=<commit id from original repo you templated from>
YOUR_FIRST_COMMIT=<first commit id in your repo>
YOUR_BRANCH=master
Run Code Online (Sandbox Code Playgroud)

接下来,您需要将模板添加为遥控器并获取它。

git remote add upstream git@github.com:whatever/foo.git
git fetch upstream
Run Code Online (Sandbox Code Playgroud)

最后,您需要将所有缺少的提交重新设置到分支上

git rebase --onto ORIGINAL_COMMIT_ID YOUR_FIRST_COMMIT YOUR_BRANCH
Run Code Online (Sandbox Code Playgroud)

这基本上是在 ORIGINAL_COMMIT_ID 的基础上创建一个分支,然后手动将原始分支上的所有提交应用到这个新分支上。

这给你留下了如果你分叉的话你拥有的东西。

从这里开始,您就可以git merge upstream/master像分叉一样。

完成合并后,您需要使用git push --force将所有更改推送到远程。如果您正在与一个团队合作,则在执行此操作时需要与每个人进行协调,因为您正在更改存储库的历史记录。

注意:需要注意的是,这仅适用于一个分支。如果您有多个功能分支,则需要对每个功能分支执行相同的步骤。


Dan*_*ado 8

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

git remote add template [URL of your repo]
Run Code Online (Sandbox Code Playgroud)

然后运行git fetch更新更改

git fetch --all
Run Code Online (Sandbox Code Playgroud)

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

git merge template/[branch to merge]
Run Code Online (Sandbox Code Playgroud)

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

  • 尝试添加`--allow-unrelated-history` (9认同)
  • 此策略仍然需要手动合并,例如包含第 1 行到第 5 行的“Readme.md”,其中每行仅包含行号,其中模板的第 2 行从“2”更改为“2a”,以及“的第 4 行” Copy/forked/sub”存储库从“4”更改为“4a”。而人们会期望自动合并“1 2a 3 4a 5”(空格是新行)。我认为这是因为缺乏相关的历史记录。有没有更好的方法将更改从模板传播到子项目? (8认同)
  • 我试过这个,但我得到一个错误:“致命:拒绝合并不相关的历史”。我猜如果模板真的是_forks_,这会起作用吗? (6认同)

jos*_*hua 7

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

  1. 复制您要用于创建新存储库的模板存储库的 URL。(前任:https://github.com/<username>/my-template.git

  2. 使用GitHub Importer基于模板存储库创建新存储库。

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

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

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

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

    git fetch template
    
    Run Code Online (Sandbox Code Playgroud)
  5. 然后,合并或变基。我建议在公共存储库上合并并在私人存储库上重新建立基础。

    合并

    git checkout <branch-to-merge-to>
    git merge template/<branch-to-merge>
    
    Run Code Online (Sandbox Code Playgroud)

    变基

    git checkout <branch-to-merge-to>
    git rebase upstream/<branch-to-merge>
    
    Run Code Online (Sandbox Code Playgroud)

    注意:变基时,您必须

    git push origin <branch-name> --force
    
    Run Code Online (Sandbox Code Playgroud)

    为了覆盖远程分支上的旧提交。这就是为什么我建议仅在私人仓库上重新建立基础。


Dim*_*din 6

我将链接到与 HRK44 相同的位置,但我的答案非常不同。

https://help.github.com/en/articles/creating-a-repository-from-a-template

虽然在同一节中提到了 fork 和模板,但它们有很大的不同。

链接中提到的差异之一是:

一个新的分支包括父存储库的整个提交历史,而从模板创建的存储库以单个提交开始。

这基本上意味着您将无法从模板中提取新的更改,因为您的 git 历史记录非常不同并且不是基于相同的东西。

如果您确实使用了已接受的答案中提到的方法,您将进行非常困难的手动合并,这将导致对从模板收到的所有文件进行更改,即使它们自您第一次从该模板创建该存储库以来没有更改.

简而言之,从模板创建 repo(仅使用 master 分支)与以下过程相同:

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
Run Code Online (Sandbox Code Playgroud)

从模板创建 repo 时没有(令人惊讶地)复制的其他一些东西:(除非 github 稍后修复此问题)

  1. 回购配置(允许的合并类型、权限等)
  2. 分支规则

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


小智 6

使用名为actions-template-sync的 GitHub Action 可以有效解决此问题。该操作旨在以自动方式同步 git 存储库,并且它支持不同的 git 提供商,例如 GitHub(企业)、GitLab 等。它的主要开发目的是帮助从模板创建的存储库保持最新状态模板存储库。

以下是其一些主要功能:

  • 它可以与其他公共或私有存储库(例如模板存储库)与当前存储库同步。
  • 它支持使用.templatesyncignore文件同步时忽略文件和文件夹。
  • 它提供了许多配置选项。
  • 它支持不同的生命周期挂钩,从而可以使用 yaml 定义文件将自定义代码注入到工作流程中。
  • 它支持不同的 git 提供商,如 GitLab、Gitea 等作为源(使用 ssh)。

此操作的一大优点是它不一定要求源存储库和目标存储库具有相同的基本历史记录。这意味着您可以借助此操作合并两个完全不同的存储库。

这是一个如何使用它的简单示例:

  1. 首先,将操作添加到您的 GitHub 工作流程中。在存储库中创建一个.github/workflows/sync.yml文件并添加以下内容:
name: Sync with template

on:
  push:
    branches:
      - main

jobs:
  sync:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Template Sync
        uses: BernhardStrauss/actions-template-sync@v0.8.0
        with:
          source_repo: "https://github.com/source_owner/source_repo.git"
          source_branch: "main"
          github_token: ${{ secrets.GITHUB_TOKEN }}
Run Code Online (Sandbox Code Playgroud)

替换"https://github.com/source_owner/source_repo.git"为模板存储库的 URL 和"main"要从中同步的分支。secrets.GITHUB_TOKEN是为您的存储库自动创建的内置 GitHub 机密。

  1. 将此文件推送到您的存储库:
git add .github/workflows/sync.yml
git commit -m "Add template sync workflow"
git push
Run Code Online (Sandbox Code Playgroud)
  1. 现在,每次您推送到main存储库的分支时,工作流程都会运行并将您的存储库与模板同步。

请记住将source_repo和替换source_branch为您的实际模板存储库和分支。这github_token应该是您的个人访问令牌。

您可以在官方文档中找到更详细的使用说明和选项。