相关疑难解决方法(0)

你如何合并两个Git存储库?

请考虑以下情形:

我在自己的Git仓库中开发了一个小型实验项目A. 它现在已经成熟,我希望A成为更大的项目B的一部分,它有自己的大型存储库.我现在想添加A作为B的子目录.

如何将A合并到B中,而不会丢失任何一方的历史记录?

git merge repository git-subtree

1517
推荐指数
16
解决办法
44万
查看次数

如何将现有的Git存储库导入另一个?

我在一个名为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 merge git-merge

445
推荐指数
8
解决办法
18万
查看次数

git-mv的目的是什么?

据我所知,Git并不需要跟踪文件重命名/移动/复制操作,那么git mv的真正目的是什么?手册页不是特别描述性的......

它已经过时了吗?它是一个内部命令,不是普通用户使用的吗?

git

275
推荐指数
7
解决办法
9万
查看次数

本地分支,本地跟踪分支,远程分支和远程跟踪分支之间有什么区别?

我刚刚开始使用Git,我在不同的分支之间真的很困惑.任何人都可以帮我弄清楚以下分支类型是什么?

  • 当地分公司
  • 本地跟踪分支
  • 远程分支
  • 远程跟踪分支

他们之间有什么区别?他们如何相互合作?

我想,快速演示代码将非常有用.

git version-control git-remote git-branch

139
推荐指数
4
解决办法
6万
查看次数

如何组合两个不相关的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 git-rebase

9
推荐指数
2
解决办法
2607
查看次数

将git存储库组合到子目录中时出错

我已经看过几个解决这个问题的线程.

组合多个git存储库

组合多个git存储库,名称中包含空格

我还查看了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)

git history

7
推荐指数
1
解决办法
2347
查看次数

如何将两个 git 存储库合并到父文件夹中的一个存储库中?

我在同一个父文件夹中有两个存储库,我想将它们合并到父文件夹中,并且如果可能的话,保留历史记录而没有最小的差异。

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

6
推荐指数
1
解决办法
1531
查看次数

如何将嵌套的git repo合并到父repo中,保留历史记录?

现在我知道大多数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

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

合并两个Git存储库并保留主历史记录

我需要将两个Git存储库合并到一个全新的第三个存储库中.我按照以下说明操作,但结果不符合我的预期.在不破坏文件历史记录的情况下合并两个Git存储库

看这个:

Git Merge操作

主人没有被分配.

  • 是否可以将所有内容合并到同一个主服务器上?
  • 我想对主人有一个干净的历史.

您可以在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 merge master

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