6

假设我有一个Common可以独立使用的库,并且被项目P1和使用P2,所以我想要的树看起来像

/Common/.git
        ...
/P1/.git
    .gitmodules  # points to remote server
    Common/
    ...
/P2/.git
    .gitmodules  # points to remote server
    Common/
    ...

当我在 中进行更改时/Common,我希望能够在提交之前使用P1和测试它。P2使用通常的git submodule命令集,我必须从 提交/Common,推送到远程,然后从两者中拉取/P1/Common/P2/Common。如果提交破坏了某些内容,则无法对其进行修改,因为错误的更改已经发布。或者,我可以git remote add quicktest /Common/P?/Common不接触远程服务器的情况下进行拉取。但这有很多不一致的机会,并且从中删除损坏的提交/P?/Common以便可以在/Common.

我宁愿在开发过程/Common中使用P1and中的工作树P2,但我无法创建/P1/Common符号链接,/Common因为git submodule将符号链接识别为与目录不同。大多数文件系统不允许硬链接目录。我可以使用硬链接所有文件

rm -rf /P1/Common
cp -rl /Common /P1/Common

在添加新文件之前效果很好,/Common在这种情况下需要重复此过程。两者都有优雅的方式吗

  1. 继续git clone --recursive git://remote/P1.git为最终用户工作,并且
  2. 让我可以轻松地测试/Common使用P1P2
4

2 回答 2

0

我宁愿建立一个中间裸仓库,用于:

  • 推送Common新的提交
  • 从 forP1/CommonP2/Common

至少,如果稍后修改/删除提交,则该中间仓库从未在外部发布,您仍然可以将您的P1/CommonP2/Common子模块重置为该中间仓库内容。


更新:如果您使用的是git worktreeGit 2.5(2015 年 7 月,写此答案 5 年后),请确保使用Git 2.25 (Q1 2020)
在此之前,“ git worktree add”内部调用“ reset --hard”,这会影响子模块。

于 2010-12-06T14:21:59.250 回答
0

从 git 2.5 开始尝试 git worktree 功能。

  1. 删除/P1/Common
  2. 光盘/Common
  3. 为即将到来的工作树创建P1分支/P1/Common
  4. git worktree add ../P1/Common P1

在 上做同样的事情/P2

然后,, /P1/Common/ /P2/Common andCommon working trees share the same repository/Common/.git`。

而且您可以轻松地签出在另一个工作树中提交的任何提交。

PS 你仍然可以使用 git submodule 命令来使用这个 git worktree 功能进行日常工作。

于 2017-06-23T18:20:04.920 回答