5

我的 main_repo 有这样的文件夹结构

application_root

  • 应用程序
    • 代码
        • 文件 1
        • 文件2
      • 酒吧
  • 皮肤
  • 文件 1
  • 文件2

这是主要的应用程序。我还有另一个 repo,其中包含我的主应用程序的扩展。问题是扩展目录布局与主项目的根目录重叠,例如

extension_root

  • 应用程序
    • 代码
      • 巴兹
        • 文件 1
        • 文件2
  • 皮肤
    • 文件 1
    • 文件2
  • 文件 3
  • 文件4

所以我不能使用子模块工具。我需要合并这两个存储库以进行进一步的开发。我需要能够从 extension_repo 合并到 main_repo 并返回,所以如果我对合并到 main_repo 的扩展进行更改,我只能将这些更改(没有应用程序本身)合并到 extension_repo。我不知道这是否可能。似乎读取树合并可以满足我的要求,但我不能以这种方式使用它

git read-tree --prefix=/ -u extension_remote_branch

因为我收到了这个错误

error: Entry '.gitignore' overlaps with '.gitignore'.  Cannot bind.

我想我重叠的所有目录都会出现这个错误。除了.gitignore,我实际上没有重叠的文件。

4

4 回答 4

5

到目前为止,我还没有找到通过 git 在单个命令中执行此操作的方法;所以我使用了一个相当简单的解决方法。基本方法是read-tree进入第二个空目录。然后将第二个目录移到第一个目录之上。

基本流程是:

mkdir upstream-tree
git read-tree --prefix=upstream-tree/ -u myremote/branch
git commit -m "Pulled in remote tree"
cp -rf upstream-tree/* local-tree/
git rm -r upstream-tree
git add local-tree
git commit -m "Merged upstream-tree into local-tree"
于 2014-09-23T14:26:21.330 回答
1

让我猜猜。你是magento开发者?

现在我找到了一个解决方案:

  • 克隆你的扩展仓库
  • 添加干净框架的远程(在我的例子中是magento),
  • git merge -s ours --no-commit ...
  • 从框架 repo 中读取树并重置索引

现在所有更改都将保存到扩展程序的存储库中。没有框架的文件。不幸的是,这种方法只适用于一个扩展。但我看到了一种有趣的方式,即为.git每个扩展名重命名文件夹。我还没有尝试过。

于 2013-03-10T00:08:15.920 回答
1

检查您的索引 - 如果您一直在“尝试”git read-tree但在语法正确之前对其进行了一些尝试,那么您的索引中可能会有一堆没有显示的更改导致冲突。

我今天遇到了这个确切的场景,试图将read-tree一个现有项目放入一个空的(新的)git repo 的根目录中——在我和我的分支git read-tree --prexfix=/ -u BRANCH之后完美地工作。resetcleanmaster

于 2014-02-27T19:02:35.473 回答
1

作为解决方法,您可以read-tree进入不同的文件夹,然后将其移回,例如:

git remote add foo git@example.com/foo.git
git fetch foo
git reset
git read-tree --prefix=new/ -u foo/master:/
git mv new/* .
rsync -vuar --delete-after new/ .
rm -fr new
于 2016-02-25T18:22:08.240 回答