如何分叉单回购的一部分,并且仍然能够合并上游提交



有时我在GitHub上发现monoreo由多个npm包组成,我想对其进行一些修改,并在我的项目中使用它。但是,对于npm来说,从git子目录安装包要比从git存储库安装要困难得多[1][2]。由于我会自己进行修改,我想知道如何建立自己的git存储库,以便npm可以轻松安装,并可以合并上游的更改。

目前,我使用GitHub的这个指南将包从monoreto的其他部分(即(中分离出来

git filter-branch --prune-empty --subdirectory-filter FOLDER-NAME  BRANCH-NAME 

Npm可以很容易地安装repo,但我发现很难合并任何上游更改。

以前有人这样做过吗?知道吗?

实际上,我想我错过了一些东西-合并上游更改并不像我想象的那么难,因为git子树拆分是确定性的,即无论该过程重复多少次,它都会为同一子树拆分生成相同的SHA1。


所以这是我的解决方案:

  1. 克隆monoreto
  2. 将默认分支(主分支(重命名为其他分支,例如上游

    git checkout master
    git branch -m upstream
    
  3. 从monorepo 中拆分子目录

    git checkout upstream
    git subtree split -P <subdirectory path> -b master
    

    现在我们有一个主分支,它只包含与子目录路径相关的提交。

  4. (可选(设置master分支的远程并将其推送到GitHub。

如果上游单回购增加了一些变化:

  1. 检查上游分支并提取更改

    git checkout upstream
    git pull
    
  2. 再次拆分

    git subtree split -P <subdirectory path> -b upstream-patch
    

    检查修订图,您会看到新的分支(上游补丁(与master相关。

    gitk master upstream-patch
    
  3. 现在只需合并新分支即可掌握

    git checkout master
    git merge upstream-patch
    

    手动解决任何合并冲突。

  4. (可选(数字推送

这是不可能分叉单存储库的一部分的,因为git将无法计算出能够与上游同步的好Sha1。

但也许"稀疏结账"正是你想要的。这样您就可以在工作目录中选择所需的子目录。

请参见示例https://gist.github.com/sumardi/5559896和http://schacon.github.io/git/git-read-tree.html#_sparse_checkout

最新更新