我在BitBucket上托管了一个Git存储库,它具有以下目录结构:

/Automation
/Website
/Website/   <-- [WebsiteFilesGoHere]
/Dependencies
/WebServices

我们有一个供应商正在构建解决方案的一部分。
他们有一个像这样的回购协议
/    <-- [WebsiteFilesGoHere]

将他们的回购协议拉入我们的子文件夹,然后能够在以后的日期推出的最佳方法是什么?
更新:值得一提的是,两个repo在当前的`/website'文件夹中都有文件,彼此不了解。
更新2:这也是一个基于Windows的git repo,在许多开发人员之间共享(因此避免任何本地机器配置将是很好的)。

最佳答案

有一种方法可以在不使用子模块或子树的情况下引入远程存储库,即使该存储库与您的存储库完全无关并且目录冲突。
首先,将该存储库添加为.git/config中的一个远程设备。例如,假设您想从Github引入Zaldor的Gruff库。这些名字完全是虚构的:

[remote "gruff-upstream"]
fetch = +refs/heads/*:refs/remotes/gruff/*
url = https://github.com/zaldor/gruff.git

现在可以执行git fetch gruff-upstream以获取所有对象。现在,您可以在gruff项目中看到可用的分支。
$ git branch -r
gruff/experimental-hack
gruff/master
origin/master

这两条gruff线是gruff的分支。origin/master是我们自己的起源。名称冲突:gruff有一个master并且我们也有一个master。这并不重要:我们可以给gruff/master一个不同的本地分支名称。
$ git branch -t gruff-master gruff/master
Branch gruff-master set up to track remote branch master from gruff-upstream.

现在,如果我们git checkout gruff-master,所有git跟踪的文件都将消失,替换为工作副本:
$ git checkout gruff-master

现在我们可以稍微梳理一下这个分支。例如,我们可以将其所有文件移动到子目录,删除不需要的文件,等等:
$ mkdir gruff
$ git mv ...files... gruff
$ git commit -a -m "moving gruff stuff to gruff/ subdir"

接下来,我们切换回自己的gruff。粗暴的文件消失了,我们的文件又回来了:
$ git checkout master

现在,我们可以将一些文件从gruff-master导入到我们的master中:
$ git checkout gruff-master -- gruff/file1 gruff/file2 ...

这些文件在我们的工作副本中具体化,并添加到我们的索引中:
$ git checkout
A gruff/file1
A gruff/file2
...

我们现在可以将这些提交到我们的gruff中。
当上游的master发布文件的新版本时,我们可以切换到master并拉。根据清理和提交解决新的更改。回到我们的gruff上,我们可以从我们的gruff-branch本地跟踪分支挑选新的更新。
是的,这基本上是使用git作为一个光荣的补丁工具。从master中选取到gruff-master中的材料没有任何祖先;它看起来就像添加的文件。然而,它比什么都没有要好,而且在许多方面比子树或模块更不麻烦。

08-26 12:31