【问题标题】:How can I track changes against a subdirectory of a git repository?如何跟踪 git 存储库的子目录的更改?
【发布时间】:2013-10-08 10:55:44
【问题描述】:

我正在对 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,但仍然合并上游更改(通过刷新供应商子树)。

但是,这似乎不是很优雅。尽管我只关心两个子目录,但我在我的仓库中携带了整个上游代码库。

我还尝试了什么?

我最初尝试使用 sparseCheckout 来限制从上游拉入的目录。它似乎完全符合我的要求,但 repo 仍然包含所有上游代码。更重要的是,sparseCheckout 设置在 repo 被克隆时不会复制。

我想要什么

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

【问题讨论】:

    标签: git git-subtree


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-08-09
      • 2021-05-13
      • 1970-01-01
      • 2012-07-30
      • 2012-07-08
      • 2019-02-16
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      相关资源
      最近更新 更多