如何将一些文件从一个 git 存储库移动到另一个(不是克隆),保留历史记录

2024-01-11

我们的 Git 存储库最初是一个庞大的 SVN 存储库的一部分,其中每个项目都有自己的树,如下所示:

project1/branches
        /tags
        /trunk
project2/branches
        /tags
        /trunk

显然,使用以下命令将文件从一个移动到另一个是非常容易的svn mv。但在 Git 中,每个项目都在自己的存储库中,今天我被要求从project2 to project1。我做了这样的事情:

$ git clone project2 
$ cd project2
$ git filter-branch --subdirectory-filter deeply/buried/java/source/directory/A -- --all
$ git remote rm origin  # so I don't accidentally overwrite the repo ;-)
$ mkdir -p deeply/buried/different/java/source/directory/B
$ for f in *.java; do 
>  git mv $f deeply/buried/different/java/source/directory/B
>  done
$ git commit -m "moved files to new subdirectory"
$ cd ..
$
$ git clone project1
$ cd project1
$ git remote add p2 ../project2
$ git fetch p2
$ git branch p2 remotes/p2/master
$ git merge p2 # --allow-unrelated-histories for git 2.9+
$ git remote rm p2
$ git push

但这似乎相当复杂。一般来说,有更好的方法来做这种事情吗?或者我采取了正确的方法?

请注意,这涉及将历史记录合并到现有存储库中,而不是简单地从另一个存储库的一部分创建一个新的独立存储库(就像之前的问题一样 https://stackoverflow.com/questions/359424/detach-move-subdirectory-into-separate-git-repository).


如果您的历史记录正常,您可以将提交作为补丁取出并将其应用到新存储库中:

cd repository
git log \
  --pretty=email \
  --patch-with-stat \
  --reverse \
  --full-index \
  --binary \
  -m \
  --first-parent \
  -- path/to/file_or_folder \
  > patch
cd ../another_repository
git am --committer-date-is-author-date < ../repository/patch 

或者在一行中

git log --pretty=email --patch-with-stat --reverse --full-index --binary -m --first-parent -- path/to/file_or_folder | (cd /path/to/new_repository && git am --committer-date-is-author-date)

提示:如果应将源项目子目录中的提交提取到新的存储库根目录,git am可以给出一个像这样的参数-p2从补丁中删除额外的目录。

(取自Exherbo 的文档 http://exherbo.org/docs/contributing.html#submitting_patches_for_package_repositories)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将一些文件从一个 git 存储库移动到另一个(不是克隆),保留历史记录 的相关文章

  • git 推送到 github 失败并显示“错误:pack-objects 因信号 967 死亡”

    我触发了这个命令 git push origin master 我得到这个结果 Counting objects 15626 done Delta compression using up to 4 threads error pack o
  • 如何使用 git 比较不​​在存储库中的两个文件

    我想比较两个不在任何 git 存储库中的 css 文件 git中有这样的功能吗 git的 diff 比标准 Unix 更实用diff 我经常想这样做 并且由于这个问题在谷歌上排名很高 所以我希望这个答案出现 这个问题 如何使用git dif
  • 在我的例子中,GIT 添加恢复(保留更改)

    在我对文件进行更改之后 我用git add FILE NAME 然后 我想将其恢复为未添加但与此同时保留更改 这个怎么做 git reset FILE NAME会做的 See the git reset manual https git s
  • 使用BFG时可以指定多个文件吗?

    我正在尝试删除通配符无法覆盖的多种类型的文件 我尝试使用多个 delete files 但它不接受它 还尝试将文件全部放在 delete files 之后 但它也不接受它 有没有一种方法可以将它们全部放在一个命令中 如果没有 那么我必须运行
  • Git checkout 不会丢弃我的更改

    我在 Windows XP 上使用 git 1 7 1 和 cygwin 这个问题可以通过例子得到最好的说明 git status On branch master Changed but not updated use git add
  • 如何更改 GitHub 上的文件模式?

    git add test file git commit m first commit create mode 100644 test file git push git update index add chmod x test file
  • GitLab:无法将代码推送到服务器?

    我已经在 Ubuntu 服务器上安装了 GitLab 一切似乎都工作正常 除了我无法向服务器推送 拉取 克隆 当我按下时 我收到一般错误消息 fatal Could not read from remote repository Pleas
  • git push --force-with-lease 总是安全吗?

    我一直遵循的规则是 一旦 git 历史记录被推送到远程存储库 就不再修改它 但我想知道交互式变基到推送 force with lease 是否绕过了这条规则 如果强制租约成功 对其他用户来说是否完全安全 或者此策略有任何注意事项吗 预先感谢
  • 有没有一种干净的方法来处理两个以相同内容开头的原始 git 存储库?

    假设我有两个根据相同的初始内容创建的存储库 例如 如果我使用 git 来管理 etc apache2 中的 apache 配置文件 然后我运行git init分别在机器 A 和机器 B 上 此后 我对 machine b 进行了一些配置更改
  • 仅使用 git 存储未暂存的更改(不是 --keep-index)

    首先 我确实知道 keep index 这不是我想要的 因为它仍然隐藏着all更改 但将暂存的更改保留在工作树中 如果可能的话 我只想存储未暂存的文件 而无需再次添加所有更改git stash patch 如果您想存储索引 已暂存的内容 和
  • 在 Windows 下克隆 git repo 时,出现“错误:无法创建文件 <文件>...(是目录)”

    Z gt git clone git github com kennethreitz httpbin git Cloning into httpbin remote Counting objects 1073 done remote Com
  • 在git的远程存储库上创建私有分支

    我想在我们公司的 git 上构建特定的流程 开发人员在他的本地计算机上创建一个分支并在那里提交一些文件 dev 将此分支推送到远程仓库 其他开发者无法访问该分支 经过几轮推动开发人员决定发布他的更改 将他的私人分支合并到公共分支 推动该公共
  • 如何在没有 Nexus/Artifactory/etc 的情况下索引 Maven 存储库?

    我为一些开源运行我自己的小 Maven 存储库 我没有专用服务器 所以我使用谷歌代码存储库 https code google com p code cop code source browse repo mvn2repo 部署到文件系统然
  • 如果 git 凭证管理器显示令牌,它如何安全

    I have credential helper manager core 这是 Windows 凭据管理器的新助手 我不明白如果你可以让 git 显示你的凭据 它如何安全git credential fill 重现步骤 通过执行命令确认凭
  • git Push Remote:警告:hooks.mailinglist 有多个值

    我刚刚从使用 gitosis 升级到 gitolite 电子邮件通知适用于所有存储库 但对于 gitolite admin 存储库 我在推送时收到此警告 推送很好 git push remote warning hooks announce
  • 使用 Homebrew 安装 Git 时出现问题 [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Homebrew 升级 Git 时出现问题 https stackoverflow com questions 12362021 problems upgrading git with home
  • 显示其 diff 包含特定字符串的所有提交

    正如标题所说 我想找到每个差异包含特定字符串的提交 目前 我使用 git log p filename 它显示了不太像每个差异的界面 我在其中搜索字符串 然后我回溯以找到实际的提交消息 简单的替代方案可能是将 git log p 通过管道传
  • git 忽略行结尾

    我知道已经有人问过类似的问题 但我仍然无法让它发挥作用 我的项目在使用不同操作系统的人之间共享 而我使用的是 OSX 另外 并不是每个人都使用 git 有时我最终不得不提交其他人的更改 有时 git 会突然说有待处理的更改 查看文件 它们看
  • git 查找胖提交

    是否可以获取有关每次提交中的更改浪费了多少空间的信息 以便我可以找到添加了大文件或大量文件的提交 这一切都是为了尝试减少 git repo 的大小 变基并可能过滤提交 你可以这样做 git ls tree r t l full name H
  • 如何使用 vim 作为“git log”编辑器?

    当我跑步时git log 编辑器到底是什么git log正在使用 Also 无论如何我可以使用吗vim作为我的默认编辑器git log 如果我想搜索 git 日志 最好的方法是什么 现在我正在做类似的事情 git log grep bla

随机推荐

  • FormData 如何在多部分/表单数据中获取或设置边界 - Angular

    我有一个迷你应用程序 我必须将表单数据从浏览器发布到端点 这是我的帖子 var formData new FormData formData append blobImage blob imagem new Date getTime ret
  • 如何在打开新模态时隐藏 Bootstrap 上一个模态?

    我有这样的麻烦 我有使用 Bootstrap 模式进行的身份验证 当用户打开登录模式时 他可以转到注册模式 或其他模式 所以 我需要关闭上一个 现在我像这样关闭它们 document ready function a click funct
  • Java - 登录到使用基于表单的身份验证的网站

    我正在尝试登录一个使用基于表单的身份验证的网站 以便我的应用程序可以进入 下载受保护的页面 然后退出 是的 我有一个有效的用户名 密码组合 I know 1 登录页面的url2 登录身份验证器的URL3 方法 帖子 4 我的信息 显然 5
  • NSNetworkManager.ResolveListener 消息 Android

    有人可以解释一下可以传递到回调中的错误消息吗 public void onResolveFailed NsdServiceInfo serviceInfo int errorCode 我以前见过错误代码 3 但不知道它意味着什么 该文档充其
  • 何时在 WCF 服务中调用析构函数

    我需要创建一个维护 WCF 会话的服务 在构造函数中 我从数据库读取数据 当会话结束时 我必须将其保存回来 如果我理解正确 当我在客户端上调用 Close 时 会话结束 我的客户端 ServiceClient 是使用 SvcUtil exe
  • Swift - tableView 中的可移动行仅在一个部分内,而不是在部分之间

    有没有办法防止 tableView 中的单元格移动到不同的部分 The sections具有不同类型单元格的数据 因此当用户尝试将单元格拖到不同部分时 应用程序会崩溃 我只想允许用户在该部分内移动单元格 而不是在部分之间移动 相关代码如下
  • Tensorboard 无法获取运行的第一个事件时间戳

    我正在尝试可视化我在远程服务器上训练的培训课程 我使用 scp 将文件复制到本地 iMac 中 我尝试通过运行张量板来可视化数据 它运行张量板网站 但我无法获得可视化效果 每个图表都有一个零点 我在终端上收到此警告 WARNING tens
  • 如何抑制“git rebase --continue”的编辑器?

    我经常重新调整交互式基础以对历史记录进行微小的更改 例如删除空白行或编辑一行 在大多数情况下 这些更改是基于一些同行评审 首先我这样做 git rebase interactive 83bbeb27fcb1b5e164318fa17c55b
  • 如何在Java中将英文数字转换为中文

    我必须将英文数字转换为中文数字 但中文的数字系统与英语不同 有什么办法可以在运行时将英文数字转换为中文吗 建议使用而不是自己滚动ICU4J http site icu project org 数字格式 http icu project or
  • 命名路由 _path 与 _url

    Rails 提供命名路线 http api rubyonrails org classes ActionDispatch Routing html 可以使用路径或 url 调用路由助手 例如来自文档 and provide these na
  • 当 Fiddler 可以解密时为什么要使用 HTTPS [重复]

    这个问题在这里已经有答案了 我刚刚发现 Fiddler 可以解密 HTTPS 流量 例如 我使用 HTTPS 在本地主机上部署了一个网站 在 Fiddler 中检查数据包时 我能够查看所有信息 因为它有解密选项 我的问题是 当 Fiddle
  • Java Spring Jackson json库返回unicode而不是文本

    我正在使用这个教程 http www mkyong com spring mvc spring 3 mvc and json example http www mkyong com spring mvc spring 3 mvc and j
  • SAP GUI 脚本 - 按钮按下失败

    我在运行 SAP GUI 的 Excel 文件中使用宏 有一个步骤 当我单击 SAP 中的按钮时 会弹出另一个窗口 为此 我编写了这样的代码 session findbyid wnd 0 XX btnXX press session fin
  • 使用模块在 Eclipse 中创建 Google App Engine 项目

    我一直在按照 cloud google com 上的建议使用 Eclipse 和 Maven 编写 GAE 应用程序 最近 我需要使用 后端 或一组不同的实例来处理特定任务 我发现 后端 已被弃用 取而代之的是 模块 在过去的几天里 我一直
  • C - for 循环的缩写,仅执行一次

    我在 Mac 上用 ANSI C 编写了命令行实用程序 其中包含为单链表创建冒泡排序数组的函数 我声明了循环变量 int a 0 int b 0 我以缩写风格编写了循环的冒泡排序 即 将变量初始化留空 for a lt size a for
  • 使用 Google 地图轨迹 API

    我必须开发一个车辆跟踪系统 我已经完成了 Google Map API 和 Google Map Tracks API 教程 IE Google 地图 API 网络 https developers google com maps docu
  • 在 Java 中如何将一个数组的值设置为另一个数组的值?

    假设您有两个数组 int a 2 3 4 int b 4 5 6 如何将数组 a 设置为数组 b 并使它们保持不同的不同对象 就像我想到这样做 a b 但这不起作用 因为它只是创建 a 引用数组b 那么 将两个数组设置为相等 同时保持它们独
  • 从序列图创建代码

    有没有办法从序列图生成代码 我能找到的只是逆向工程 即 从生成的代码中您可以获得序列图 有没有办法做其他事情 从图表到源代码生成 UML 类图已经实现了这一点 相同的链接http msdn microsoft com en us libra
  • 创建 App Engine 后端时找不到 gcm.jar 错误 => 建议安装已弃用的库

    使用 Android Developer Studio 我尝试从菜单中为现有 Android 项目创建 App Engine 后端 工具 gt Google Cloud 工具 gt 生成 App Engine 后端 错误消息是 找不到 gc
  • 如何将一些文件从一个 git 存储库移动到另一个(不是克隆),保留历史记录

    我们的 Git 存储库最初是一个庞大的 SVN 存储库的一部分 其中每个项目都有自己的树 如下所示 project1 branches tags trunk project2 branches tags trunk 显然 使用以下命令将文件