如何将更改从skeleton子存储库转换为生产超级存储库

Man*_*ikJ 1 git aurelia

我正在使用Aurelia骨架,其中包含用于不同目的的各种项目设置,但它更像是一个关于如何使用git执行某些操作的一般问题,如下所述.

我希望能够将GitHub框架存储库中发布的更新合并到我实际工作的项目中.你会怎么做?

目前我刚刚在skeleton-typescript项目(我正在使用)中初始化了一个新的本地存储库,并将其连接到一个私有远程仓库以推送我的更改.但是通过这种设置,我正在使用我的项目特定更改来污染父存储库(远程指向Github上的aurelia-skeleton).

由于aurelia-skeleton远程存储库通常仅用于提取变化,因此进行某种单向跟踪将是完美的.

作为第二步,如何使用这样的设置创建拉取请求将会很有趣.在这种情况下,我想使用我在子存储库中所做的更改合并到aurelia远程的fork中...

Jef*_*ett 5

我通常的工作流程是创建一个专用分支来跟踪上游项目.您可以在该分支上挑选您想要的内容并创建拉取请求,而不会使用您的项目细节混淆模板.


首先,继续前进并分叉,aurelia/skeleton-navigation这样您就可以通过Github的GUI轻松发出拉取请求.

使用名为upstream文件夹中命名的远程克隆项目的forkskeleton-typescript

git clone -o upstream git@github.com:YOUR_GITHUB_USERNAME/skeleton-navigation.git skeleton-typescript

cd skeleton-typescript
Run Code Online (Sandbox Code Playgroud)

重命名主分支.

git branch -m asmaster
Run Code Online (Sandbox Code Playgroud)

为其创建一个新的存储库 skeleton-typescript

提示:你可以做使用命令行此项权利GitHub的API的东西,如curl

curl --data '{"name":"skeleton-typescript"}' -u YOUR_GITHUB_USERNAME https://api.github.com/user/repos
Run Code Online (Sandbox Code Playgroud)

添加遥控器.

git remote add origin git@github.com:YOUR_GITHUB_USERNAME/skeleton-typescript.git
Run Code Online (Sandbox Code Playgroud)

将repo拆分为子树(参见手册页的源代码),该子树将包含一个新树,其中包含prefix目录中文件的所有提交历史记录.

git subtree split --prefix=skeleton-typescript
Run Code Online (Sandbox Code Playgroud)

这将打印出一个提交ID,该ID是HEAD子树的.

539d913a8cf9b34b644273b5cdb480359553247c

从该提交创建主分支.

git checkout -b master 539d913a8cf9b34b644273b5cdb480359553247c
Run Code Online (Sandbox Code Playgroud)

推送并跟踪您的新回购.

git push -u origin master
Run Code Online (Sandbox Code Playgroud)

向后移植

做一些工作 skeleton-typescript

echo "notable contribution" >> file.txt
git add .
git commit -m "backport test commit"
git push origin master
Run Code Online (Sandbox Code Playgroud)

检查上游超级项目分支,并挑选子树提交.

git checkout asmaster
git cherry-pick -x --strategy=subtree master
git push upstream asmaster:master
Run Code Online (Sandbox Code Playgroud)

现在,您可以从上游fork YOUR_GITHUB_USERNAME/skeleton-navigation:master分支向其aurelia/skeleton-navigation:master分支发出pull请求.

更新

现在,对于上游的上游(aurelia/skeleton-navigation:master)将会有更新,其中包括对子树skeleton-typescript文件夹的更新.

添加另一个遥控器以跟踪原始项目.

git remote add upupstream git@github.com:aurelia/skeleton-navigation.git
Run Code Online (Sandbox Code Playgroud)

请注意,您现在在本地存储库中有3个遥控器.

git remote -v
Run Code Online (Sandbox Code Playgroud)
origin    git@github.com:YOUR_GITHUB_USERNAME/skeleton-typescript.git (fetch)
origin    git@github.com:YOUR_GITHUB_USERNAME/skeleton-typescript.git (push)
upstream  git@github.com:YOUR_GITHUB_USERNAME/skeleton-navigation.git (fetch)
upstream  git@github.com:YOUR_GITHUB_USERNAME/skeleton-navigation.git (push)
upupstream    git@github.com:aurelia/skeleton-navigation.git (fetch)
upupstream    git@github.com:aurelia/skeleton-navigation.git (push)
Run Code Online (Sandbox Code Playgroud)

下拉更新.

git checkout asmaster
git pull upupstream master
Run Code Online (Sandbox Code Playgroud)

再次拆分子树并获取HEAD提交.

git subtree split --prefix=skeleton-typescript
Run Code Online (Sandbox Code Playgroud)

095c0c9f7ed06726e9413030eca4050a969ad0af

切换回子项目.

git checkout master
Run Code Online (Sandbox Code Playgroud)

如果您从未向后移植更改,那么一个值得注意的属性git subtree split是您将拥有完全相同的哈希提交历史记录,因此您可以快速转发合并而无需重写历史记录.来自文档:

完全相同历史的重复拆分保证是相同的(即产生相同的提交ID).因此,如果您添加新提交然后重新拆分,新提交将作为提交附加在您上次生成的历史记录之上,因此git merge和friends将按预期工作.

git merge 095c0c9f7ed06726e9413030eca4050a969ad0af
Run Code Online (Sandbox Code Playgroud)

但是,如果您已经向后移植了挑选的更新或子树历史记录的任何其他更改,那么您将需要重新更改,否则您将有重复的提交.

git rebase 095c0c9f7ed06726e9413030eca4050a969ad0af
Run Code Online (Sandbox Code Playgroud)