如何将一些文件从一个 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 存储库?

    创建损坏的 git 存储库有哪些方法 有没有有趣的方法可以永久损坏 git 存储库 你能否削弱一个 git 存储库 使其行为有些正常 但会做一些奇怪的事情 我的兴趣来自于当有人担心他们是否真的创建了不可恢复的状态时 它通常很容易修复或至少可
  • 在 git 提交消息中使用任何 utf-8 字符是否安全?

    我发现使用 UTF8 字符 例如 很有用 请参阅here http www utf8icons com subsets dingbats 在提交消息中 重构 NewService 添加了更好的服务 OldServiceA 据我所见 它see
  • 如何让 git 和 copSSH 在正确的目录中查找密钥?

    我刚刚安装了 Windows 版 copSSH 当我启动它时 我得到一个目录C copSSH home Nick ssh其中有我的酒吧和私钥 当我通过 Cygwin bash 窗口访问此目录时 使用 ssh 用户 主机 我很高兴地登录了 但
  • 如何使用 git hook pre-merge-commit 获取原始合并分支名称

    我正在尝试使用新的 git hook pre merge commit 创建一个特定的脚本 但它没有参数 有什么解决方法可以让我获得正在合并的分支的名称吗 例子 在分支 myBranch 上 我调用 git merge testingBra
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • Git refs/remotes/origin/master 没有指向有效的对象

    在上次合并到 Git 存储库的 master 分支后 我失去了克隆存储库的能力 Cloning into test repository remote Counting objects 126084 done remote Compress
  • 使用 Subversion 进行部分提交

    鉴于我做的案例两个独立的变化 in one文件 例如 添加了一个新方法并更改了另一个方法 我经常不想提交这两项更改 因为one提交 但作为two独立承诺 在 git 存储库上我会使用互动模式 of git 添加 1 http linux d
  • 从 master 更改为新的默认分支 git

    这是一个场景 我们有一个默认的分支 Master 我们以此为基础 创建分支并向上推等等 我们现在创建了一个Develop分支Master并将其设置为默认开发分支 我想知道的是 我现在如何知道我的 git pull 命令是否通过命令行请求默认
  • 如何使用“gem install”命令从私有 GitHub 存储库安装 gem

    如何在本地安装托管在 GitHub 上的私人存储库中的 gem 特别是 我们通过gem install命令而不是在 Bundler 中使用 因为它是一个命令行工具 我尝试这样做 gem install githubname repo s h
  • 如何通过哈希显示提交的日期和时间

    I used git reflog识别我创建特定分支时的哈希值 我得到了哈希值fe1ddcdef 我还没有将此分支推送到远程 我现在正在尝试查找日期和时间fe1ddcdef发生 git reflog只告诉我 fe1ddcdef HEAD 1
  • 有人熟悉 git 错误“缺少对象 0000000000000000000000000000000000000000 for refs/heads/...”吗?

    我们正在运行 git v1 7 1 并配置了 gitweb 我们也使用 gitolite 进行管理 但我不认为这与这个问题有密切关系 有时我们会在 Apache 日志中收到如下错误 missing object 00000000000000
  • 如何在Windows上分离“Git bash”中启动的“git gui”?

    例如 我开始 git bash 我导航到某个目录 I start git gui 我关闭控制台窗口或按 Ctrl C Git gui 的窗口消失了 即使我用过git gui disown 即使当我按 Ctrl C 时它不在前台 如何正确分离
  • Visual Studio Code 内置故事,用于查看 git 提交历史记录并对其内容进行比较

    In this https stackoverflow com questions 37899765 how can i view the git history in visual studio code 60013101 noredir
  • 在 Azure DevOps 中为 Wix MSI 文件生成 GUID

    我正在为 Web 服务器应用程序和 Sitecore 前端应用程序设置 Wix 安装程序 我的问题并非特定于 Web 服务器或 Sitecore 我的问题是 Wix 以及如何使用它进行持续交付 1 Wix 需要每个文件和产品本身的 GUID
  • GIT - 推送到 (GitHub) origin master 没有任何作用

    我已经分叉了某人的 GIT 存储库 https github com nippysaurus toodledo objc 将其克隆到我的本地计算机 显示带有以下信息的来源 remote origin Fetch URL https emai
  • 如何禁用 GitHub 中的拉取请求?

    我试图了解如何禁用 github 中的 拉取请求 问题一 我们正在尝试使用变基工作流程 这意味着如果不是快速推进 那么使用拉取请求可能会有害 一种解决方案 为我想要禁用拉取请求的分支设置分支权限 或者将我添加为任何进入 master 的内容
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 清理远程 Git 分支

    我已经将 SVN 存储库移至 Git 可能由于多次克隆 我现在只剩下一堆看起来像这样的分支 BranchA origin BranchA remotes BranchA remotes origin BranchA remotes orig
  • 如何让 Gitlab 运行程序在成功构建时将代码合并到分支中

    嗯 标题几乎是不言自明的 总之 如果构建成功 我希望将一个分支 即开发 合并到另一个分支 即生产 我尝试了 jakub kania 解决方案 但我总是得到id rsa invalid format 我认为 gitlab 秘密变量以某种方式被
  • Jenkins GIT 包含从未构建过的区域

    我正在尝试使用包含区域在 Jenkins 中构建我的工作 但每当选中此选项时 民意调查结果总是说未检测到任何更改 我尝试了许多不同的路径 以及使用工作区进行 不进行强制轮询 结果是轮询从未检测到任何更改 但一旦我删除这些选项 它们就会在下一

随机推荐

  • 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 显然 使用以下命令将文件