我在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
中的材料没有任何祖先;它看起来就像添加的文件。然而,它比什么都没有要好,而且在许多方面比子树或模块更不麻烦。