合并子目录中的 git 存储库

2023-12-11

我想将远程 git 存储库合并到我的工作 git 存储库中作为它的子目录。我希望生成的存储库包含两个存储库的合并历史记录,并且合并存储库的每个文件都保留其历史记录,就像在远程存储库中一样。我尝试使用子树策略,如中提到的如何使用子树合并策略,但是在执行该过程之后,尽管生成的存储库确实包含两个存储库的合并历史记录,但来自远程存储库的单个文件并未保留其历史记录(其中任何一个上的“git log”仅显示一条消息“合并分支” ...”)。

另外,我不想使用子模块,因为我不想再将两个组合的 git 存储库分开。

是否可以将远程 git 存储库作为子目录合并到另一个远程存储库中,并保留来自远程存储库的各个文件并保留其历史记录?

非常感谢您的帮助。

编辑: 我目前正在尝试一种使用 git filter-branch 重写合并存储库历史记录的解决方案。它似乎确实有效,但我需要再测试一下。我会回来报告我的发现。

编辑2: 为了让自己更清楚,我给出了与 git 子树策略一起使用的确切命令,这会导致远程存储库文件的历史记录明显丢失。 令 A 为我当前正在使用的 git 存储库,B 为我希望将其合并到 A 中作为其子目录的 git 存储库。它做了以下事情:

git remote add -f B <url-of-B>
git merge -s ours --no-commit B/master
git read-tree --prefix=subdir/Iwant/to/put/B/in/ -u B/master
git commit -m "Merge B as subdirectory in subdir/Iwant/to/put/B/in."

在执行这些命令并进入目录 subdir/Iwant/to/put/B/in 后,我看到了 B 的所有文件,但是git log其中任何一个上仅显示提交消息“将 B 合并为 subdir/Iwant/to/put/B/in 中的子目录”。他们在 B 中的文件历史记录丢失了。

What seems工作(因为我是 git 的初学者,我可能是错的)如下:

git remote add -f B <url-of-B>
git checkout -b B_branch B/master  # make a local branch following B's master
git filter-branch --index-filter \ 
   'git ls-files -s | sed "s-\t\"*-&subdir/Iwant/to/put/B/in/-" |
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
                git update-index --index-info &&
        mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD 
git checkout master
git merge B_branch

上面的过滤器分支命令取自git help filter-branch,其中我只更改了子目录路径。


git-subtree是一个专门针对将多个存储库合并为一个同时保留历史记录(和/或分割子树历史记录,尽管这似乎与这个问题无关)的用例而设计的脚本。它作为 git 树的一部分进行分发自 1.7.11 版本起.

合并存储库<repo>修订时<rev>作为子目录<prefix>, use git subtree add如下:

git subtree add -P <prefix> <repo> <rev>

git-subtree 实现了子树合并策略以更加用户友好的方式。

The downside是在合并的历史记录中,文件没有前缀(不在子目录中)。假设您合并存储库a into b。因此git log a/f1将显示除合并历史记录之外的所有更改(如果有)。你可以做:

git log --follow -- f1

但这不会显示合并历史记录中的其他更改。

换句话说,如果你不改变a存储库中的文件b,那么你需要指定--follow和一个无前缀的路径。如果您在两个存储库中更改它们,那么您有 2 个命令,其中没有一个命令显示所有更改。

更多相关内容here.

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

合并子目录中的 git 存储库 的相关文章

  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 将 Visual Studio 在线 Git 存储库集成到 Android Studio 1.0.2

    我正在使用 Visual Studio Online 进行开发过程 我想将我的 Android Studio 1 0 2 代码集成到其中 但是 据我所知 Android Studio 没有 TFS 插件 这就是为什么我想使用 Git 进行源
  • 如何使用 git --word-diff 显示空格差异?

    为了说明问题 参见diff https github com nim lang Nim commit 47c7fd037ed28b7de3d120b003d059d30e18f128 diff split diff 8af935b2312d
  • 尝试配置 GIT 时 Eclipse 没有响应

    Windows 10 专业版 64 位SSD金士顿 i5 4690Eclipse 版本 全部工作空间 空问题 每次我尝试配置 TEAM gt GIT gt 配置或尝试导入 创建本地 远程 git 时 Eclipse 都会冻结 直到我强制用任
  • 使用 GitHub,在添加现有存储库时如何推送所有分支?

    我创建了一个新的 GitHub 存储库 我想将现有的存储库放在那里 我按照说明操作 cd existing git repo git remote add origin email protected cdn cgi l email pro
  • Git 中的数据完整性?

    我现在已经多次听到提到 Git 提供数据完整性 但是 这是什么意思 据我所知 git 中的所有对象都是使用 SHA 1 校验和来访问的 并且该校验和是根据文件的内容计算的 这意味着如果文件发生更改 您将得到不同的校验和 但这如何提供数据完整
  • Smartgit:自动插入提交消息

    有没有办法使用钩子脚本在 Smartgit 中自动插入提交消息 重击 如果用户提交了他的更改 我想预加载提交消息字段 我没有看到任何SmartGit配置 http www syntevo com smartgit documentation
  • 创建多个 git 分支的联合分支

    我希望能够在现有分支之上分层其他分支 并独立修改这些分支 这很有用 例如 允许将各个子项目的二进制文件统一到同一个项目中bin目录 一般来说 给定的文件仅存在于一层中 理想情况下 我想我会使用 unionfs 来完成此任务 但它必须以某种方
  • 为什么 Git Bash 无法运行我的可执行文件?

    I am on git for windows https github com git for windows 吉特 巴什 我无法在命令行上运行可执行文件 Pedr Abc 07 MINGW64 c dev ls sqlite3 exe
  • 如何在现有裸存储库中创建引用日志信息

    您可能已经知道 默认情况下 git 不会为新的裸存储库启用引用日志更新 问题是 我有一个很长的历史存储库 但它是在我设置 logAllRefUpdates 标志之前创建的 现在我希望其他应用程序可以使用该信息 如何通过对现有存储库进行最少的
  • 使用nodegit切换分支/标签

    我整个早上都在尝试打开现有的存储库并使用 nodegit 更改分支或标签 文档内容很丰富 但似乎已经过时了 关于我做错了什么有什么想法吗 var NodeGit require nodegit var open NodeGit Reposi
  • git 清除远程仓库

    如果我将错误的初始提交 或多个 推送到远程存储库 并且只想清除 销毁它 我可以通过命令来完成吗 将其从服务器中完全删除非常重要 这样它就不会占用磁盘空间 例如 今天我推送了一个完整的 Visual Studio 项目 其中包含 dll sd
  • Heroku 没有更新 Rails 应用程序的 CSS

    我在 heroku 上更新 Rails 应用程序时遇到问题 我已经启动了我的应用程序 但我尝试更改 public stylesheets 中的 application css 文件 但每当我尝试推送到 heroku 时 CSS 都不会更改
  • 为什么我们应该在 git commit 命令中使用 -m ?

    git commit m my commit 我们使用此命令将提交添加到我的 Github 存储库 这个 m 是什么意思 Do a git commit help m是为了留言 这将出现在您的提交历史记录中 例子 git commit m
  • gitbranch --merged 使用管道命令

    有没有办法达到相当于 git branch merged 使用 git 管道命令 我知道有类似的命令git for each ref它为您提供提交哈希值及其相应的引用名称 是否有一个命令可以判断某个提交是否可以从另一个提交访问 这基本上就是
  • 使用 svn 元数据克隆 git-svn 存储库

    我已经克隆了我的主存储库git svn clone svn url trunk stdlayout 现在我想使用 svn 元数据克隆存储库 这样我就能够git svn rebase它到主服务器 注意 我不想在两个之间推送提交git svn克
  • git checkout 后,Git 丢失了本地提交文件

    我从另一个分支切换 这样我就可以进行推送 在进行结账时 文件在我的编辑器中打开 这可能导致权限被拒绝错误 git 丢失了我的所有文件吗 我不知道如何让他们回来 这就是我所做的 丢失的文件有js Messages目录templates Mes
  • 为什么我无法推送这个最新的 Git 子树?

    我将 Git 子树与我正在开发的几个项目一起使用 以便在它们之间共享一些基本代码 基本代码经常更新 升级可能发生在任何项目中 最终所有项目都会更新 我遇到了一个问题 git 报告我的子树是最新的 但推送被拒绝 例如 git subtree
  • 有没有办法强制 git merge 始终使用外部合并工具?

    有没有一种方法可以配置 git merge 使冲突解决始终通过外部合并工具进行 我正在编写语义合并的配置 并且存在这样的情况 git 错误地处理了这些情况 但可以通过语义合并正确解决 两个开发人员在同一文件的两个不同位置添加了相同的方法 问
  • 使用 cron 作业推送到 GitHub - 权限被拒绝(公钥)

    我已经创建了一个 SSH 密钥 如下官方教程 https help github com articles generating ssh keys 00 将其添加到 GitHub 并创建一个 Bash 脚本 用于提交单个文件并将其推送到我在

随机推荐

  • 如何将数据从 iCloud 存储文件迁移到本地存储中的新存储文件?

    I have iCloud在我的应用程序中 我已经删除了iCloud从我的应用程序 但在 ios 6 应用程序崩溃 我收到此消息 NSPersistentStoreCoordinator addPersistentStoreWithType
  • 将 app.config 与类库一起使用

    我经常需要创建一个 Net 类库 它需要 app config 来存储数据库连接字符串等内容 但是 这些设置必须位于调用应用程序的 app config 或 web config 中 如果我想跨多个应用程序分发 DLL 这会变得很痛苦 因为
  • 将多行环境变量拆分为几行

    我有以下问题 我在 Jenkins 服务器上执行 Windows 批处理文件 并且必须将多行环境变量 通过 Jenkins 参数设置 拆分为单行 每一行都是另一个程序的参数列表的一部分 Jenkins 文本框参数 foo 224 bar S
  • xtable 的颜色代码单元格

    我用过 R sweave 但是notknit 和 xtable 创建一个表 其中 1 列是标识符 其他三列是 标志 列 它们要么为空 要么包含 1 标志 我希望能够对最后三列进行着色 以便每个单元格要么是绿色 如果为空白 要么是红色 如果包
  • 无法使用 Vitamio 进行直播

    我正在尝试使用Vitamio要运行 RTSP 视频流 我在更新 Vitamio sample 后使用它来运行流VideoViewDemo活动 public class VideoViewDemo extends Activity TODO
  • Hadoop 流命令失败并出现 Python 错误

    我是 Ubuntu Hadoop 和 DFS 的新手 但我已经按照 Michael Noll com 上发布的说明成功在本地 ubuntu 计算机上安装了单节点 hadoop 实例 http www michael noll com tut
  • Html.Hidden 字段未设置

    我的视图中有一个隐藏字段 如下所示 using Html BeginForm Action Schedule Html Hidden Id Model Schedule Id 以及一个接受如下信息的操作方法 public ActionRes
  • 如何在C中读取或捕获Ctrl+某个键或Alt+某个键?

    For example I want to do some thing when some combination of Ctrl key with any other key is pressed or it may be Alt key
  • 忽略 TextField SwiftUI 组合中输入中的左侧空格

    我正在传递给 TextField 发布的变量 TextField First name text state firstName 我想控制估算 如果从左侧输入 则忽略空格 我可以在哪里以及如何做 可以使用代理绑定来完成 如下所示 TextF
  • 在 Mercurial 中指定编辑器

    一般来说 如果我有一个 W 类型的自定义文件 并且想要使用自定义应用程序 编辑器 X 打开 查看它 当我想要编辑 查看该文件时 如何设置 Hg 来调用应用程序 X 具体示例 我使用 TortoiseHg 来跟踪一组文件 这些文件是由自定义应
  • 可以观察到分组和去抖动吗?

    我有一个可观察的对象 它发出一个包含一些参数的对象 在对象中 参数之一 称为optionId 明确标识一个选项 我想消除该发射的所有实例 然而 如果一个新的optionId出现 我想启动一个新的时钟 并开始一个新的反跳 这是我正在寻找的示例
  • 如何在 Swift 中创建自定义 getter 方法?

    我正在尝试使用以下代码为我的属性创建自定义设置方法 var myProperty String get if CONDITION1 return CONDITION1 STRING else if CONDITION2 return CON
  • “adb install”返回错误:协议错误(无状态)

    我已经创建并运行了几个 Android 模拟器 现在我想在它们上安装应用程序 这是我多次尝试的故事 adb s emulator 5562 install xxx apk daemon not running starting it now
  • 标题大写

    我正在尝试编写一种将标题大写的方法 它不应将每个单词都大写 而应仅将大单词大写 如果您愿意的话 有时 它必须将每个单词大写 也许我需要为这些小词添加一个例外 这是 Ruby 教程的一部分 我无法使用 Railstitleize方法 这是我到
  • R - 使用 par() 创建 ggplot 绘图网格 - 未按预期工作[重复]

    这个问题在这里已经有答案了 我有一些数据看起来像这样 Generate example data exampleData lt data frame Month sample 1 5 500 replace T Product sample
  • WPF 和 NotifyPropertyChanged 来自不同的线程

    我对 WPF 非常有经验 但有一件事困扰着我 我正在使用 ReactiveUI 引发 INotifyPropertyChanged 事件 我有两个类似的地方 public UiModel UiModel get return uiModel
  • 使用 Odeint 求解复矩阵微分方程

    我想求解矩阵微分方程 像这个 import numpy as np from scipy integrate import odeint def deriv A t Ab return np dot Ab A Ab np array 0 2
  • 使用c#读取Word文档

    我需要从一个特定的点开始阅读word文档 该关键字取自下拉组合框 关键字类似于 blah blah blah 001 所以 我只需要阅读从该关键字到下一个标题的内容 我用它来逐行读取标题编号 但标题编号不起作用 string headNum
  • C++ 睡眠函数

    我正在尝试执行一个有点准确的睡眠功能 我测量了我的睡眠功能睡了多长时间 并将它们并排放置 下面示例的格式为 预期毫秒 结果毫秒 我尝试了很多选择 但仍然找不到解决方案 以下是我尝试过的路线 Route 1 Sleep
  • 合并子目录中的 git 存储库

    我想将远程 git 存储库合并到我的工作 git 存储库中作为它的子目录 我希望生成的存储库包含两个存储库的合并历史记录 并且合并存储库的每个文件都保留其历史记录 就像在远程存储库中一样 我尝试使用子树策略 如中提到的如何使用子树合并策略