我正在使用包含各种项目设置的Aurelia skeleton用于不同目的,但它更像是一个关于如何使用git执行某些操作的一般问题,如下所述。
我希望能够将GitHub框架存储库中发布的更新合并到我实际工作的项目中。你会怎么做?
目前我刚刚在skeleton-typescript项目(我正在使用)中初始化了一个新的本地存储库,并将其连接到私有远程仓库以推送我的更改。但是通过这种设置,我正在使用我的项目特定更改来污染父存储库(远程指向Github上的aurelia-skeleton)。
进行某种单向跟踪将是完美的,因为aurelia-skeleton远程存储库通常仅用于提取更改。
作为第二步,如何使用这样的设置创建拉取请求会很有趣。在这种情况下,我想将我在子存储库中所做的更改合并到aurelia远程的fork中...
答案 0 :(得分:5)
我通常的工作流程是创建一个专用分支来跟踪上游项目。您可以在该分支上挑选您想要的内容并创建拉取请求,而不会使用您的项目细节混淆模板。
首先,请继续前叉aurelia/skeleton-navigation
,这样您就可以通过Github的GUI轻松发出拉取请求。
使用名为upstream
skeleton-typescript
的远程方法克隆项目的分支
git clone -o upstream git@github.com:YOUR_GITHUB_USERNAME/skeleton-navigation.git skeleton-typescript
cd skeleton-typescript
重命名主分支。
git branch -m asmaster
为skeleton-typescript
提示:您可以使用Github's API从命令行执行此操作,例如curl
curl --data '{"name":"skeleton-typescript"}' -u YOUR_GITHUB_USERNAME https://api.github.com/user/repos
添加遥控器。
git remote add origin git@github.com:YOUR_GITHUB_USERNAME/skeleton-typescript.git
将repo拆分为子树(see source code for man page),该子树将包含一个新树,其中包含prefix
目录中所有文件的提交历史记录。
git subtree split --prefix=skeleton-typescript
这将打印出一个提交ID,即子树的HEAD
。
539d913a8cf9b34b644273b5cdb480359553247c
从该提交创建主分支。
git checkout -b master 539d913a8cf9b34b644273b5cdb480359553247c
按下并跟踪您的新回购。
git push -u origin master
在skeleton-typescript
echo "notable contribution" >> file.txt
git add .
git commit -m "backport test commit"
git push origin master
签出上游超级项目分支,并挑选子树提交。
git checkout asmaster
git cherry-pick -x --strategy=subtree master
git push upstream asmaster:master
现在,您可以从上游分支YOUR_GITHUB_USERNAME/skeleton-navigation:master
分支向其aurelia/skeleton-navigation:master
分支发出拉取请求。
现在,上游的上游(aurelia/skeleton-navigation:master
)无疑会更新,其中包括对子树skeleton-typescript
文件夹的更新。
添加另一个遥控器以跟踪原始项目。
git remote add upupstream git@github.com:aurelia/skeleton-navigation.git
请注意,您现在在本地存储库中有3个遥控器。
git remote -v
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)
下拉更新。
git checkout asmaster
git pull upupstream master
再次拆分子树并抓住HEAD提交。
git subtree split --prefix=skeleton-typescript
095c0c9f7ed06726e9413030eca4050a969ad0af
切换回子项目。
git checkout master
如果您从未向后移植过更改,那么git subtree split
的一个值得注意的属性就是您将拥有完全相同的哈希提交历史记录,因此您可以快速转发合并而无需重写历史记录。来自the docs:
保证完全相同历史的重复拆分是相同的(即产生相同的提交ID)。因此,如果您添加新提交然后重新拆分,新提交将作为提交附加在您上次生成的历史记录之上,因此git merge和friends将按预期工作。
git merge 095c0c9f7ed06726e9413030eca4050a969ad0af
但是,如果您已经向后选择了樱桃选择的更新,或者对子树历史记录进行了任何其他更改,那么您将要重新更改,否则您将有重复的提交。
git rebase 095c0c9f7ed06726e9413030eca4050a969ad0af