git - 将多个文件夹和文件从 git 存储库复制到另一个存储库,同时保留历史记录

标签 git github bitbucket-server

我在 github/bitbucket 上有一个名为 X 的存储库,这是目录结构

├── 文件夹1 ├── 文件夹2 ├── 文件夹3 ├── 文件夹4 │ ├── a.cpp │ └── b.cpp ├── c.cpp └── d.cpp

我想创建一个名为 Y 的新存储库,它应该具有

├── 文件夹1 ├── 文件夹4 │ └── a.cpp └── c.cpp

所有文件的提交历史都应该保留,并且X的目录结构也应该完整,我该怎么做?

此外,如果上述情况可行,我不想将这些文件移出 X,因为 X 中的其他文件需要它们,但希望在存储库 Y 中处理它们,然后以某种方式将这些更改推送到 X。我不想更改 X 的目录结构或将复制的文件夹作为子模块。如何对 Y 中复制的文件和文件夹进行更改并将这些更改推送到 X 中所需的分支?

最佳答案

嗯...您的建议是让两个单独的存储库处理某些相同的文件,但位于同一目录中。据我所知,您无法进行精确的设置。但我也认为这不是一个很好的设置 - 你违反了“封装”规则。

更好的是:

仓库X :

├── folder1 ├── folder2 ├── folder3 ├── folder4 │ └── b.cpp ├── common (submodule called "common") | ├── c.cpp │ └── a.cpp └── d.cpp

repo Y :

├── folder1 ├── common (submodule called "common") | ├── c.cpp │ └── a.cpp └── e.cpp (repo Y only files)

仓库common

├── c.cpp └── a.cpp

所以这里有三个 git 存储库:X、Y 和 Common。 Common 是 X 和 Y 中的子模块。这是构建项目的更好方法。

然后,您的公共(public)子模块会保留共享历史记录(好吧,它自己的历史记录),并且您的特定 X 和特定 Y 文件有自己单独的历史记录。

要从您所在的位置到达那里,您需要创建两个新的存储库( Ycommon ):

  • 将常用文件移至 common。
  • 将 Y 文件移至 Y 中。
  • 将公共(public)子模块包含到 X 和 Y 中:git submodule add <url to common>
  • 提交更改并将更改推送到每个存储库。

嗯,这就是它的粗略轮廓。如果您想进一步了解,请询问...

注意:如果您希望目录结构完全完整,您可以将“common”命名为“folder4”,但它仍然需要是一个子模块..但我认为需要稍微修改一下您的文件夹最好将所有常用内容移到一个地方。

更新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 - 复制.cpp
  • cp <path-to-X\c.cpp> . - 复制c.cpp
  • git add -A - 将所有文件添加到存储库中(暂存它们)
  • git commit -m "initial version of Y" - 将文件提交到存储库
  • git remote add origin <url to remote Y> - 添加远程 Y 存储库(您必须首先在 github 中创建它)。
  • git push origin master - 假设您位于 master 分支(默认),将您的初始提交推送到远程。

正如我所说,这将创建存储库 Y,其中包含 X 的副本,作为具有新历史记录的单独存储库。如果您想获得 X 的历史记录,也可以这样做,但方法略有不同。

更新2

要创建 Y 并保留 X 的历史记录:

  • cp -r X Y - 复制 X 但将其命名为 Y
  • cd Y - cd 到 Y(注意这仍然只是 X 的副本)
  • rm -r folder2 folder3 folder4/b.cpp d.cpp - 删除 Y 中不需要的文件
  • git add -A - 添加所有更改(在这种情况下 git 将检测删除文件)
  • git commit -m "Y Created from X - initial version"
  • git remote rm origin - 删除 github 上指向 X 的 Remote 。
  • git remote add origin <url to Y on github> - 将远程添加到 github 上的 Y
  • git push origin master - 将新的存储库推送到 Y。

注意:在这里您将获得存储库 Y 中 X 的完整历史记录。Y 现在将与 X 分开继续前进(即发散)。

注意:您的要求的一个问题是 git 不适用于单个文件。

关于git - 将多个文件夹和文件从 git 存储库复制到另一个存储库,同时保留历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49842086/

相关文章:

windows - 检查其他系统中 Git 存储库的状态

bitbucket-server - Bfg-repo-cleaner 工具成功但 repo 大小没有减少

git-rebase - `Rebase and merge` 合并策略在 Bitbucket Server 上的作用是什么?

svn - 通过 Git/SVN 将前缀 ?<revision-number> 添加到代码中

Git 和讨厌的 "error: cannot lock existing info/refs fatal"

maven - 我们如何在 GitHub 中强制执行强制性审查,但仍然允许从 CI 发布 Maven 版本?

Git - 保留由特定作者完成的提交

git - pull 请求是 Git 的一部分,还是 GitHub、Gerrit 和 Atlassian Stash 等工具的一项功能?

git - 如何在 git 中添加可选子模块?

Eclipse NEON "no staged files"错误