标签: git-subtree

将其他存储库合并到子目录后修复损坏的 git 历史记录

我有以下 git 存储库

  • 回购A
  • 回购B
  • 回购协议

我合并成

  • repoAll,其中每个存储库都被移动到子目录中

所以这看起来像

  • 回购全部
    • 迪拉
    • 目录
    • 目录

我已按照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 merge git-filter-branch git-subtree

5
推荐指数
1
解决办法
3539
查看次数

今天我该如何做曾经被称为“git subtree pull-all”的事情?

我看到一些参考资料表明 git 子树中最初有一个“git subtree pull-all”功能(在它合并到主 git 分支之前)。就像http://rentzsch.tumblr.com/post/22061209807/apps-i-love-git-subtree

我需要的是一种快速获取当前存储库中存在的子树(以及子树的子树,递归地...)的方法。今天建议的做法是什么?Push-all 也会很方便。我不想使用子模块。

谢谢!

git git-subtree

5
推荐指数
0
解决办法
411
查看次数

svn 到带有嵌套 svn:externals 的 git 迁移

从带有 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

5
推荐指数
1
解决办法
1802
查看次数

Git:有没有办法自动推送子树?

我有一个在本地网络上维护的大型私有存储库。我想自动将该存储库的子树推送到该网络之外。我需要它很简单:

*任务*某人推送到本地远程存储库 --> 子树会自动推送到其他某个存储库

我不确定这是否可以通过服务器端挂钩来实现,因为 AFAIK 没有从裸遥控器推送子树这样的事情。我想出了两个想法:

  • 我可以在服务器上克隆远程并自动拆分克隆远程中的子树。这并没有真正的帮助,因为我不知道如何自动拉取子树(其他人也有这个问题)。
  • 另一个想法是编写一个自定义客户端post-commit-hook并让每个用户都安装它,但这很糟糕,不是吗?Git book 特别指出应该在服务器端强制执行策略

有没有一种简单的方法可以实现这样的目标?或者这是不可能的,这只是 git 滥用?

git githooks git-subtree

5
推荐指数
1
解决办法
1080
查看次数

如何在 git 的存储库之间共享公共文件?

我的项目中有 2 个组件(A 和 B),它们都有自己的 GIT 存储库。这些组件 A 和 B 共享一个接口(可以说,只是一个头文件 interface.h )。在 SVN 中,通过使用 SVN 外部属性,可以非常简单地在 2 个存储库之间共享此接口文件,而无需复制。我如何在 GIT 中实现同样的目标。我希望能够以无缝方式从两个存储库更新接口文件。

我读过有关 git 子树的内容,其中涉及仅为一个接口文件创建第三个存储库。这种方法对于我的场景来说太过分了。任何人都可以建议类似于 SVN::external for git 的最简单的解决方案吗?

git git-subtree

5
推荐指数
1
解决办法
2867
查看次数

切换 Git 子树分支的正确方法?

假设我已经添加了一个新的远程“foo”,并拉了一个子树,压扁了,分支主。

$ git remote add -f foo some-repo.git
$ git subtree add --prefix=foo --squash foo master
Run Code Online (Sandbox Code Playgroud)

从我读过的文章(herehere等)来看,这似乎是切换分支的常用方法。在这种情况下,要分支“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)

git subtree git-subtree

5
推荐指数
1
解决办法
1006
查看次数

是否有更简单的方法从单一存储库发布到不同的存储库?

我有一个带有纱线工作区(和lerna)的monorepo

-package
--one
--two
-site
Run Code Online (Sandbox Code Playgroud)

一个脚本将它们中的每一个(站点)推送到它们的 github 存储库

我用类似的东西来做这个

-package
--one
--two
-site
Run Code Online (Sandbox Code Playgroud)

它(到目前为止)有效,尽管速度很慢

问题是我这样做是否正确,或者还有其他更好的解决方案

git git-checkout git-tag git-subtree git-branch

5
推荐指数
1
解决办法
1356
查看次数

加入同一存储库旧版本的历史记录

我有一个包含此历史记录的存储库:

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 --graftgit filter-branch

更新 2

现在我的任务完成了,我发布了下面问题的完整正确答案。

git git-subtree git-history

5
推荐指数
1
解决办法
144
查看次数

该库没有通过 git 子树添加到 git

我通过 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 git-subtree

5
推荐指数
1
解决办法
1486
查看次数

当我使用git-subtree时,为什么我被告知"'master'没有引用提交"?

当我进入时,> git subtree add --prefix=<some dir> --squash <some repo> master我收到了消息'master' does not refer to a commit.如果我将'master'改为sha,我仍然会收到警告.回购有效,主要存在于我试图引入的回购中.

git git-subtree

4
推荐指数
1
解决办法
1889
查看次数