我正在对 PHP Web 应用程序中的模块进行一些客户端修改。我可以访问 git repo 中的上游源代码,并且我想在我们自己的 git repo 中跟踪我们的更改。
完整的源代码仓库很大(与模块相比),所以我更愿意在我们的仓库中提取模块(包含在两个子目录中)......但我希望能够在未来合并任何上游更改。
如果我控制上游仓库,我会将模块拆分为子树。但我不是,所以我不能!
到目前为止我最好的解决方案
初始化我自己的仓库:
mkdir myrepo
cd myrepo
git init .
git touch .gitignore
git add .gitignore
git commit -m "Initialise repo"
然后将上游仓库添加为远程:
git remote add -f upstream /path/to/upstream/repo
将上游代码作为一个分支跟踪(并以良好的衡量标准签出):
git checkout -b upstream upstream/master
将上游分支作为子树合并到我的主分支中:
git checkout master
git subtree add --prefix vendor/upstream upstream --squash
然后创建我自己的 src 目录,其中包含指向我要处理的上游目录的符号链接:
mkdir src
cd src
ln -s ../vendor/upstream/path/to/directory1 .
ln -s ../vendor/upstream/path/to/directory2 .
为什么要这样做?
我现在有一个 src 目录,它只代表我想要处理的模块。我可以将我的更改提交到我的 repo,但仍然合并上游更改(通过刷新供应商子树)。
然而,这似乎不是很优雅。尽管我只关心两个子目录,但我在我的 repo 中携带了整个上游代码库。
我还尝试了什么?
我最初尝试使用 sparseCheckout 来限制从上游拉入的目录。它似乎完全符合我的要求,但 repo 仍然包含所有上游代码。更重要的是,当 repo 被克隆时,sparseCheckout 设置不会复制。
我想要的是
这个问题有更好/更优雅的解决方案吗?我意识到理想是在上游推出一个子回购,但我不能这样做。我真的不需要跟踪上游版本历史......除了我想轻松合并上游更改。