1

我正在对 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 设置不会复制。

我想要的是

这个问题有更好/更优雅的解决方案吗?我意识到理想是在上游推出一个子回购,但我不能这样做。我真的不需要跟踪上游版本历史......除了我想轻松合并上游更改。

4

1 回答 1

0

如果您的操作系统支持符号链接(即不是 Windows):在其他地方创建模块 repo,并创建指向要在代码中使用的两个目录的符号链接。当您想要下拉模块更改时,请 cd 到模块 repo 并拉入那里。当您想从自己的代码中推送更改时,从这里的最佳答案看起来, Git 会完全按照您的意愿行事。

于 2013-10-08T13:32:59.953 回答