我在github / bitbucket上有一个名为X的repo,这是目录结构
├── folder1
├── folder2
├── folder3
├── folder4
│ ├── a.cpp
│ └── b.cpp
├── c.cpp
└── d.cpp
我想创建一个名为Y的新回购,它应该有
├── folder1
├── folder4
│ └── a.cpp
└── c.cpp
应保留所有文件的提交历史记录,并且X的目录结构要完整,我该怎么做?
如果上述情况可能,我不想将这些文件移出X,因为X中的其他文件需要它们,但是想要在repo Y中处理它们,然后以某种方式将这些更改推送到X.我不想更改X的目录结构或将复制的文件夹作为子模块。如何在Y中复制的文件和文件夹中进行更改并将这些更改推送到X中所需的分支?
答案 0 :(得分:2)
嗯...你的建议是在同一个目录中有两个单独的repos工作在一些相同的文件上。据我所知,你不能确切地设置。但我也认为这不是一个很好的设置 - 你正在打破"封装"规则。
最好的是:
repo X
:
├── folder1
├── folder2
├── folder3
├── folder4
│ └── b.cpp
├── common (submodule called "common")
| ├── c.cpp
│ └── a.cpp
└── d.cpp
回购Y
:
├── folder1
├── common (submodule called "common")
| ├── c.cpp
│ └── a.cpp
└── e.cpp (repo Y only files)
repo common
├── c.cpp
└── a.cpp
所以这里你有三个git回购:X,Y和Common。 Common是X和Y中的子模块。这是构建项目的更好方法。
然后您的公共子模块保留共享历史记录(以及它自己的历史记录),并且您的特定X和特定Y文件具有各自独立的历史记录。
要从那里到达那里,您需要创建两个新的回购(Y
和common
):
git submodule add <url to common>
嗯,这是它的粗略轮廓。如果您想进一步澄清,请问......
注意:如果您希望目录结构完整无缺,则可以命名&#34; common&#34; to&#34; folder4&#34;但它仍然需要是一个子模块..但我认为你的文件夹的轻微重做更好地将所有常见的东西移到一个地方。
更新1
来自@ J.Doe的请求,这里是如何从X创建Y,但没有子模块,你将有Y的文件副本......
mkdir Y
- 创建新文件夹(在任何git仓库之外)cd Y
- 进入该文件夹git init
- 将其转换为git存储库cp -r <path-to-X\folder1> .
- 将folder1复制到repo mkdir folder4
- 创建一个文件夹4。cp <path-to-X\folder4\a.cpp> folder4
- 复制a.cpp cp <path-to-X\c.cpp> .
- 复制c.cpp git add -A
- 将所有文件添加到repo中(暂存它们)git commit -m "initial version of Y"
- 将文件提交到repo git remote add origin <url to remote Y>
- 添加远程Y repo(您必须先在github中创建它)。git push origin master
- 假设您在主分支(默认)上将初始提交推送到远程。正如我所说,这将创建回购Y,其中包含来自X的副本作为具有新历史的单独回购。如果你想拥有X的历史,你也可以这样做,但方法略有不同。
更新2
创建具有X保留历史的Y:
cp -r X Y
- 制作X的副本,但称之为Y cd Y
- cd进入Y(注意这仍然只是X的副本)rm -r folder2 folder3 folder4/b.cpp d.cpp
- 删除您不想要的文件git add -A
- 添加所有更改(在这种情况下git将检测删除文件)git commit -m "Y Created from X - initial version"
git remote rm origin
- 删除指向github上的X的遥控器。git remote add origin <url to Y on github>
- 在github上添加遥控器git push origin master
- 将新回购推送给Y. 注意:在这里你将拥有回购Y中X的整个历史.Y现在将与X分开(即发散)。
注意:您的要求的一个问题是git不能用于单个文件。