如何跟踪git存储库子目录的更改?

时间:2013-10-08 10:55:44

标签: git git-subtree

我正在对PHP Web应用程序中的模块进行一些客户端修改。我可以访问git仓库中的上游源代码,我想在我们自己的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目录,它只代表我想要处理的模块。我可以将我的更改提交到我的仓库,但仍然会合并上游更改(通过刷新供应商子树)。

然而,这似乎并不优雅。我在我的仓库中携带整个上游代码库,即使我只关心两个子目录。

我还尝试了什么?

我最初尝试使用sparseCheckout来限制从上游引入的目录。它似乎在我的盒子上做了我想要的,但是repo仍然包含所有上游代码。更重要的是,当克隆repo时,sparseCheckout设置不会复制。

我想要什么

这个问题有更好/更优雅的解决方案吗?我意识到理想的是在上游分出一个子仓库,但我做不到。我真的不需要跟踪上游版本的历史...除了我想在上游变化中轻松合并的事实。

1 个答案:

答案 0 :(得分:0)

如果您的操作系统支持符号链接(即不是Windows):在其他地方创建模块仓库,并为要在代码中使用的两个目录创建符号链接。如果要下拉模块更改,请cd到模块仓库并进入模块仓库。如果你想从你自己的代码中推进更改,它会从the top answer here看起来像Git那样完全按照你想要的那样。