我有一个Git存储库,其中包含许多子目录.现在我发现其中一个子目录与另一个子目录无关,应该分离到一个单独的存储库.
如何在将文件的历史记录保存在子目录中的同时执行此操作?
我想我可以制作一个克隆并删除每个克隆的不需要的部分,但我想这会给我一个完整的树,当检查旧版本等.这可能是可以接受的,但我宁愿能够假装两个存储库没有共享历史记录.
为了说清楚,我有以下结构:
XYZ/
.git/
XY1/
ABC/
XY2/
Run Code Online (Sandbox Code Playgroud)
但我想这样做:
XYZ/
.git/
XY1/
XY2/
ABC/
.git/
ABC/
Run Code Online (Sandbox Code Playgroud) 请考虑以下情形:
我在自己的Git仓库中开发了一个小型实验项目A. 它现在已经成熟,我希望A成为更大的项目B的一部分,它有自己的大型存储库.我现在想添加A作为B的子目录.
如何将A合并到B中,而不会丢失任何一方的历史记录?
使用git子模块和子树之间有什么概念上的区别?
每种情况的典型情况是什么?
我需要将两个Git存储库合并到一个全新的第三个存储库中.我已经找到了很多关于如何使用子树合并进行此操作的描述(例如JakubNarębski关于如何合并两个Git存储库的答案?)并遵循这些说明大多数工作,除了当我提交子树合并所有文件从旧存储库记录为新添加的文件.我可以在旧的存储库中看到提交历史记录git log,但如果我这样做git log <file>,则只显示该文件的一次提交 - 子树合并.从对上述答案的评论来看,我并不是唯一一个看到这个问题的人,但我发现没有公开的解决方案.
有没有办法合并存储库并保持个别文件历史记录完整?
我正在使用Git子树和我正在处理的几个项目,以便在它们之间共享一些基本代码.基本代码经常更新,升级可以在任何项目中进行,最终所有项目都会更新.
我遇到了一个问题,git报告我的子树是最新的,但是推送被拒绝了.例如:
#! git subtree pull --prefix=public/shared project-shared master
From github.com:****
* branch master -> FETCH_HEAD
Already up-to-date.
Run Code Online (Sandbox Code Playgroud)
如果我推,我应该得到一个消息,没有什么可以推动......对吗?对?:(
#! git subtree push --prefix=public/shared project-shared master
git push using: project-shared master
To git@github.com:***
! [rejected] 72a6157733c4e0bf22f72b443e4ad3be0bc555ce -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:***'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about …Run Code Online (Sandbox Code Playgroud) 我觉得使用Git子模块对于我的开发工作流程来说有点麻烦.我听说过Git子树和Gitslave.
我正在尝试学习在Git 1.7.11中添加的新git-subtree命令.添加子树后,我似乎失去了变基的能力.我有一个带有README文件的主存储库和一个库存储库,它也有一个README文件.我将它添加到lib目录subtree add:
$ git subtree add -P lib/mylib myliborigin master
Run Code Online (Sandbox Code Playgroud)
这很好,但现在历史看起来像这样:
* 22c1fe6 (HEAD, master) Merge commit 'b6e698d9f4985825efa06dfdd7bba8d2930cd40e' as 'lib/mylib' -
|\
| * b6e698d Squashed 'lib/mylib/' content from commit d7dbd3d
* b99d55b Add readme
* 020e372 Initial
Run Code Online (Sandbox Code Playgroud)
现在当我想要反对我的repo origin/master并且它失败时因为squash commit直接应用于它不适用的父提交,因为它被应用于repo的根而不是我添加的时候给它的前缀子树.
如果我看一下壁球提交,原因很清楚.没有关于前缀的信息.这只是原始的mylib提交压扁在一起.只有下一个合并提交知道它的任何内容,但rebase不会在此处考虑它.
是否有任何变通方法(除了永远不会对子树提交进行重新定位)?
有什么问题可以git subtree解决?何时以及为什么要使用该功能?
我已经读过它用于存储库分离.但为什么我不只是创建两个独立的存储库而不是将两个不相关的存储库合二为一?
这个GitHub教程解释了如何执行Git子树合并.
我知道如何使用它,但不知道何时(用例)及其原因,以及它与之相关的方式git submodule.当我依赖于另一个项目或库时,我会使用子模块.
例如,你可以做一个git remote --verbosegit将显示你项目中的所有遥控器,git branch将显示所有分支并发出当前分支的信号,但是如何列出所有子树,没有任何破坏性命令?git subtree将给出用法示例,但不会列出任何内容.子树只有add,pull,push,split,merge.
有没有办法使用git-subtree将远程存储库的子目录添加到我的存储库的子目录中?
假设我有这个主存储库:
/
dir1
dir2
Run Code Online (Sandbox Code Playgroud)
而这个库存储库:
/
libdir
some-file
some-file-to-be-ignored
Run Code Online (Sandbox Code Playgroud)
我想将library/libdir导入main/dir1,使它看起来像这样:
/
dir1
some-file
dir2
Run Code Online (Sandbox Code Playgroud)
使用git-subtree,我可以指定使用参数导入dir1--prefix,但是我是否还可以指定仅获取子树中特定目录的内容?
使用git-subtree的原因是我以后可以同步这两个存储库.
git-subtree ×10
git ×9
git-rebase ×1
git-repo ×1
git-slave ×1
git-subrepo ×1
merge ×1
pull ×1
push ×1
repository ×1