我有以下 git 存储库
我合并成
所以这看起来像
我已按照http://jasonkarns.com/blog/merge-two-git-repositories-into-one/上的说明进行操作以实现此目的。这本质上意味着
git remote add -f repoA /path/to/repoA
git merge -s ours --no-commit repoA/master
git read-tree --prefix=dirA/ -u repoA/master
git ci -m "merging repoA into dirA"
...
Run Code Online (Sandbox Code Playgroud)
但是现在文件的历史记录不再连接了
git log --follow dirA/pom.xml
Run Code Online (Sandbox Code Playgroud)
什么也没显示。
然而,
git log --follow pom.xml
Run Code Online (Sandbox Code Playgroud)
确实显示该文件的正确(旧)历史记录。这还不够好,因为没有任何工具(例如 eclipse 或其他 git 客户端)能够显示完整的历史记录。
更糟糕的是,合并的存储库上已经有新的提交,因此再次进行合并并不是真正的选择(我现在知道我应该在进行合并之前进入)repoA/*。repoA/dirA
我考虑过插入一个提交,该提交将在 repoAll 上的初始合并之前进行移动,但这需要我对所有更改(现在是 100+)进行变基并解决更改。
问题/解决方案Git 日志在执行读取树合并后显示很少,以及如何重写历史记录,以便所有文件(除了我已经移动的文件)都位于子目录中?似乎只适用于整个存储库,不适用于特定的子目录(或者至少如果您已经在 repoAll 上有了新的提交)。
我认为应该有某种方法来重写特定子目录(例如 dirA)的历史记录,但我似乎不知道如何重写。
我看到一些参考资料表明 git 子树中最初有一个“git subtree pull-all”功能(在它合并到主 git 分支之前)。就像http://rentzsch.tumblr.com/post/22061209807/apps-i-love-git-subtree
我需要的是一种快速获取当前存储库中存在的子树(以及子树的子树,递归地...)的方法。今天建议的做法是什么?Push-all 也会很方便。我不想使用子模块。
谢谢!
从带有 svn externals 的 svn 迁移到 git。每个 svn externals 可能有它自己的 svn:externals。我发现这里没有关于如何将带有外部的 svn 迁移到 git 的指南。每个分支可能有它自己的分支标签主干。迁移整个存储库的最佳方法是什么?我正在查看主存储库的 git svn clone 添加 git 子模块,以及每个外部克隆的子模块。但是由于外部是嵌套的,我不知道什么是最好的解决方案。到目前为止使用的脚本:
https://github.com/eneroth/git-externals
https://github.com/eneroth/git-externals
Run Code Online (Sandbox Code Playgroud) git-svn svn-externals git-submodules git-subtree git-subrepo
我有一个在本地网络上维护的大型私有存储库。我想自动将该存储库的子树推送到该网络之外。我需要它很简单:
*任务*某人推送到本地远程存储库 --> 子树会自动推送到其他某个存储库
我不确定这是否可以通过服务器端挂钩来实现,因为 AFAIK 没有从裸遥控器推送子树这样的事情。我想出了两个想法:
post-commit-hook并让每个用户都安装它,但这很糟糕,不是吗?Git book 特别指出应该在服务器端强制执行策略。有没有一种简单的方法可以实现这样的目标?或者这是不可能的,这只是 git 滥用?
我的项目中有 2 个组件(A 和 B),它们都有自己的 GIT 存储库。这些组件 A 和 B 共享一个接口(可以说,只是一个头文件 interface.h )。在 SVN 中,通过使用 SVN 外部属性,可以非常简单地在 2 个存储库之间共享此接口文件,而无需复制。我如何在 GIT 中实现同样的目标。我希望能够以无缝方式从两个存储库更新接口文件。
我读过有关 git 子树的内容,其中涉及仅为一个接口文件创建第三个存储库。这种方法对于我的场景来说太过分了。任何人都可以建议类似于 SVN::external for git 的最简单的解决方案吗?
假设我已经添加了一个新的远程“foo”,并拉了一个子树,压扁了,分支主。
$ git remote add -f foo some-repo.git
$ git subtree add --prefix=foo --squash foo master
Run Code Online (Sandbox Code Playgroud)
从我读过的文章(here和here等)来看,这似乎是切换分支的常用方法。在这种情况下,要分支“bar”:
$ git rm -r foo
rm 'foo/file'.
...
$ git commit -m "Delete foo on branch 'master' to switch to branch 'bar'."
1350 files changed, 144703 deletions(-)
delete mode 100644 foo/file
...
$ git subtree add --prefix=foo --squash foo bar
git fetch foo master
From some-repo.git
* branch master -> FETCH_HEAD
Added dir 'foo'
Run Code Online (Sandbox Code Playgroud)
但这感觉很脏。为什么不直接使用已经有分支参数的“git subtree pull”(没有 rm/commit/add)?
$ …Run Code Online (Sandbox Code Playgroud) 我有一个带有纱线工作区(和lerna)的monorepo
-package
--one
--two
-site
Run Code Online (Sandbox Code Playgroud)
一个脚本将它们中的每一个(一、二和站点)推送到它们的 github 存储库
我用类似的东西来做这个
-package
--one
--two
-site
Run Code Online (Sandbox Code Playgroud)
它(到目前为止)有效,尽管速度很慢
问题是我这样做是否正确,或者还有其他更好的解决方案
我有一个包含此历史记录的存储库:
A---B---C---D
Run Code Online (Sandbox Code Playgroud)
然后,这个存储库被“拆分”(基本上,另一个存储库是使用 git-subtrees 创建的,它的历史从 'D' 开始)。
现在,我有这个历史的另一个回购:
# The same D as the other
D---E---F---G
Run Code Online (Sandbox Code Playgroud)
如何将同一项目故事情节的这两个“部分”合并到一个存储库中?
最终结果必须是:
A---B---C---D---E---F---G
Run Code Online (Sandbox Code Playgroud)
我已经尝试了很多东西,但所有这些都包括合并,这不是我想要的,因为合并不会保留一些更改,例如已删除的文件。
此外,我尝试为存储库的最后一个版本的所有更改生成补丁并将它们应用到旧版本中,但遇到了很多error: <file> already exists in index错误。
我发现这个问题,其他关于再养育一个承诺,那就是正是解决我的问题,两者的结合git replace --graft和git filter-branch。
现在我的任务完成了,我发布了下面问题的完整正确答案。
我通过 git 子树将 GLFV 库添加到项目中,但出现此警告“看起来您的 git 安装或您的 git-subtree 安装已损坏”。还描述了造成这种情况的几个原因:
如果 git --exec-path没有打印 git 安装目录的正确路径,请将 GIT_EXEC_PATH 环境变量设置为正确的目录。
确保您的git-core \ git-subtree文件位于 PATH 或 git exec 路径 ( C: / Program Files / Git / mingw64 / libexec / git-core) 中。
您应该将 git-subtree 作为 运行git core \ git-subtree,而不是作为git-core \ git-subtree。
我检查了库的链接是否正确,文件“git-subtree”在那里,为什么会弹出错误。
当我进入时,> git subtree add --prefix=<some dir> --squash <some repo> master我收到了消息'master' does not refer to a commit.如果我将'master'改为sha,我仍然会收到警告.回购有效,主要存在于我试图引入的回购中.
git-subtree ×10
git ×9
git-branch ×1
git-checkout ×1
git-history ×1
git-subrepo ×1
git-svn ×1
git-tag ×1
githooks ×1
merge ×1
subtree ×1