请考虑以下情形:
我在自己的Git仓库中开发了一个小型实验项目A. 它现在已经成熟,我希望A成为更大的项目B的一部分,它有自己的大型存储库.我现在想添加A作为B的子目录.
如何将A合并到B中,而不会丢失任何一方的历史记录?
我在一个名为XXX的文件夹中有一个Git存储库,我有第二个名为YYY的 Git存储库.
我想将XXX存储库作为名为ZZZ的子目录导入YYY存储库,并将所有XXX的更改历史记录添加到YYY.
文件夹结构之前:
??? XXX
? ??? .git
? ??? (project files)
??? YYY
??? .git
??? (project files)
Run Code Online (Sandbox Code Playgroud)
文件夹结构后:
YYY
??? .git <-- This now contains the change history from XXX
??? ZZZ <-- This was originally XXX
? ??? (project files)
??? (project files)
Run Code Online (Sandbox Code Playgroud)
可以这样做,还是我必须使用子模块?
据我所知,Git并不需要跟踪文件重命名/移动/复制操作,那么git mv的真正目的是什么?手册页不是特别描述性的......
它已经过时了吗?它是一个内部命令,不是普通用户使用的吗?
我刚刚开始使用Git,我在不同的分支之间真的很困惑.任何人都可以帮我弄清楚以下分支类型是什么?
他们之间有什么区别?他们如何相互合作?
我想,快速演示代码将非常有用.
我不太了解git.: - /
我有两个不相关的基于git的文档存储库,我想将它们合并到一个存储库中.我想保留原始时间戳(可追溯到2005年)和单个文件历史记录.这两个repos不包含分支,没有文件夹,并且在文件命名方面没有重叠.
在ASCII-land中,它看起来像这样:
REPO A |-------------------------|
REPO B |===============|
Run Code Online (Sandbox Code Playgroud)
重叠表示时间.
我的目标是"拉上"重叠的时间戳,以便两个回购看起来像一个完整的历史记录:
REPO A+B |-------------------==--=---============|
Run Code Online (Sandbox Code Playgroud)
再一次,我不太了解git,所以我可以把事搞砸了.
首先,我尝试将较新的较小的repo添加为较大的旧repo的远程,获取更改并提交结果.在旧的回购后,我结束了所有新的回购变更集中在一个分支:
MERGE |------------------------- -|
\===============/
Run Code Online (Sandbox Code Playgroud)
接下来我尝试了rebasing(with --committer-date-is-author-date),我认为它可以工作,但最后我得到一个长的提交历史,只是将两个repos堆叠在一起.
REBASE |-------------------------===============|
Run Code Online (Sandbox Code Playgroud)
我无法找到一种"重播"组合历史的方法.我真的希望rebase能成为答案.
我已经看过几个解决这个问题的线程.
我还查看了git filter-branch手册页.
更新
我已经改为2脚本系统:
#!/bin/bash
git filter-branch --index-filter '~/doit.sh' HEAD
Run Code Online (Sandbox Code Playgroud)
和doit.sh
#!/bin/bash
git ls-files -s | \
sed "s-\t-&data/perl_modules/-" | \
GIT_INDEX_FILE="$GIT_INDEX_FILE.new" git update-index --index-info && \
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
Run Code Online (Sandbox Code Playgroud)
这避免了以前的错误,但现在得到了这个(用[...]替换了路径):
Rewrite c35e4ef0626fb2045f57fa5b605e7663b8d06196 (1/10977)mv: cannot stat `[...]/.git-rewrite/t/../index.new': No such file or directory
index filter failed: ~/doit.sh
Run Code Online (Sandbox Code Playgroud)
我跑的时候
ls-files- s | sed ... | git update-index ...
Run Code Online (Sandbox Code Playgroud)
我得到它应该生成的索引文件.当我更改doit.sh文件以输出sed的结果而不是将其传递给git update-index时,它似乎产生了正确的输出......似乎git update-index在下面运行时根本就不创建文件--index过滤器....
再次更新:
当我改变
mv"$ GIT_INDEX_FILE.new""$ GIT_INDEX_FILE"
至
mv"$ GIT_INDEX_FILE.new""$ GIT_INDEX_FILE"|| 真正
它失败了第一个MV,但所有其他(到目前为止)都在工作.
所有这些都在这个脚本中达到了高潮:
git filter-branch --index-filter \
'git ls-files …Run Code Online (Sandbox Code Playgroud) 我在同一个父文件夹中有两个存储库,我想将它们合并到父文件夹中,并且如果可能的话,保留历史记录而没有最小的差异。
parent/
--code1/.git
--code2/.git
Run Code Online (Sandbox Code Playgroud)
我想:
parent/.git
--code1
--code2
Run Code Online (Sandbox Code Playgroud)
是否可以做到这一点并保留两者的历史记录?或者至少是 code1 文件夹?不幸的是,两个存储库中都有一些同名分支。理想的情况是按提交日期在 .git 中拥有两个历史记录,但我还没有找到一个简单的解决方案(一个复杂的问题是 git mv 显示提交之前/之后的差异,所有文件都已更改,但我们可以接受这一点)。
现在我知道大多数git专家会立即想到git rebase,但我更普遍地使用"rebase"这个词:我的项目结构如下:
.
..
.git
tools
lib
src
.git
build
Run Code Online (Sandbox Code Playgroud)
两者.和./src目录都是明显的git存储库,并且具有很长的历史和大量的提交.存储库.忽略src目录(这是它自己的存储库).
我刚刚意识到我只想在.跟踪包括源文件在内的所有内容时只需要一个repo ,因为坦率地说,构建系统随着源代码的发展而变得非常广泛.
我的问题是我不知道如何让这个存储库保留历史记录,该历史记录现在是存储库的一部分src.它甚至可能吗?这就是我所说的'变基' - 如果./src/main.c通过./src/.git一些N次提交跟踪变化,那么我想保留这些变化并让它们成为新存储库的一部分./.git.相同的历史,重新定位的文件路径.
UPDATE
从我收集的内容来看,子树合并不是我想要的东西.简而言之,它比我需要的更多.我只需要旧回购的内容,将所有开发分支和所有提交,标签等一起看起来好像它们始终是父回购的一部分.在本质上,唯一的变化是文件本身的路径 - 在子回购跟踪之前./main.c,新的回购现在将跟踪./src/main.c,并且据我所知,git跟踪内容,而不是文件,然后改变文件路径,如上所述和对这些的引用路径,应该是相当微不足道的,对吗?
我需要将两个Git存储库合并到一个全新的第三个存储库中.我按照以下说明操作,但结果不符合我的预期.在不破坏文件历史记录的情况下合并两个Git存储库
看这个:
主人没有被分配.
您可以在github上自由使用我的示例存储库:
这是我的合并结果.
这就是我想要的情况:(画解决方案!!!)
我如何达到目前的状况:
# Assume the current directory is where we want the new repository to be created
# Create the new repository
git init
# Before we do a merge, we have to have an initial commit, so we'll make a dummy commit
dir > Read.md
git add .
git commit -m "initial commit"
# Add a remote for and fetch the …Run Code Online (Sandbox Code Playgroud) git ×9
merge ×3
git-branch ×1
git-merge ×1
git-rebase ×1
git-remote ×1
git-subtree ×1
history ×1
master ×1
repository ×1