GIT 如何合并另一个远程Git仓库的文件到本地仓库里某个指定子文件夹并不丢失远程提交记录?

问题背景:

最近在重新整理手中的一个项目,目前该项目分为PC项目,手机项目,某第三方接口项目,第三方接口服务项目和手机项目

因为之前规划的原因,原来的四个项目是分两个解决方案来管理的

PC解决方案:

#PC解决方案,2015年从Vss迁移到Git 一共三个项目
#F:\WWW\F.COM\WWW
Flight.sln
Flight.suo
Web #PC项目

Qr #第三方接口项目 2015年新增项目,也使用PC解决方案但用分支进行管理,维护单独的通用项目,目前已经将通用项目分离到单独的分支进行单独维护(仅添加要引用的Dll即可)
QunarTTS #第三方接口服务项目2015年新增项目,也使用PC解决方案但用分支进行管理,维护单独的通用项目,目前已经将通用项目分离到单独的分支进行单独维护(仅添加要引用的Dll即可)

#所有通用项目,仅 PC&手机&第三方项目提供统一的支持
BLL
Model
Common
WebHelp
SqlServerDAL
DBUtility
Languages
FlightAPI #机票Api

Mobile #手机项目,需要从另一解决方案合并过来

  

手机解决方案:

#手机解决方案,所有DLL都会引用PC通用项目的DLL
#因为当时考虑手机跟PC的View和大部分功能不一样,所以单独一个解决方案来做
#F:\WWW\F.COM\Mobile
WebApp
WebApp.csproj #手机项目
WebApp.sln #解决方案
WebApp.suo

  

因为最近客户的业务有所调整,所以涉及到以上四个全部的项目,在处理的时候出现了以下问题

  1. 因为 PC,第三方接口,接口服务都共同维护了通用项目,所以导致我频繁在这三个项目之前切换合并(保存通用项目文件一致) 已解决
  2. 手机解决方案同其他项目一样,都使用同一通用项目的Dll但不单独维护,为什么要独立一个解决方案,决定合并到PC解决方案以分支的方式管理

于是我就开始尝试对以上问题进行解决

  1. 将PC,第三方接口,接口服务等所有通用项目从三个分支里分离到单独的分支里统一管理
    其他项目如果要更改通用文件必须切换到分支然后生成再切换回来重新添加新的Dll即可(确保通用项目文件一致性)
  2. 将手机解决方案中的项目合并到PC解决方案里,然后以新的分支Mobile进行维护

问题1已经解决,当我在把手机解决方案的项目合并到PC解决方案里,遇到此问题:

我这样获取远程Git的信息"git pull remote-address"时,手机项目文件是在PC仓库的根目录"F:\WWW\F.COM\WWW" 而我希望手机项目文件是在该根目录下Mobile目录下的“F:\WWW\F.COM\WWW\Mobile”

经过我反复测试和使用其他命令fetch等都没有解决,于是把自己的问题发在了群里,在跟群友沟通了N个小时后也没有解决我的问题,不过某个群友说可以使用subtree子目录的方式试试

于是在网上找各种资料做各种测试,终于经过二天的时间完成解决问题

合并必须满足以下条件:

1.必须完整的合并远程仓库(手机项目)的所有文件和提交记录本地仓库(PC项目)

2.远程的所有文件必须是在本地指定的目录“F:\WWW\F.COM\WWW\Mobile”而不是在本地仓库的根目录

3.合并后只有一个git仓库(将远程提交合并到本地提交)“F:\WWW\F.COM\WWW\.git”

以下为真实测试的信息:

感谢群里的朋友和网上的资料!

参考:

使用 git-subtree 以子目录形式引入外部项目    Git submodule VS Git Subtree    Git Subtree命令剖析    使用 git subtree 來分拆子目錄成獨立的新 repo

Git subtree 要不要使用 –squash 参数

Git 的子树合并和子树拆分

Merge two Git repositories without breaking file history

来自为知笔记(Wiz)

时间: 2024-10-07 22:36:38

GIT 如何合并另一个远程Git仓库的文件到本地仓库里某个指定子文件夹并不丢失远程提交记录?的相关文章

创建局域网内远程git仓库,并将本地仓库push推到远程仓库中

转自原文 创建局域网内远程git仓库,并将本地仓库push推到远程仓库中 1. 先远程登录局域网内服务器 2. 在服务器里 切换到某个文件夹下, 然后新建一个文件夹用作git仓库(文件夹名最好跟准备推到服务器的仓库文件夹名相同), 并切换到此文件夹下, 接着将用git init 命令在此文件夹下建立一个git 仓库(图中的—bare参数为建立一个裸仓库), 然后退出服务器. 3. 退出服务器后,在本地路径切换到本地仓库的根目录中, 若本地没建立仓库,则先用git init 命令建立本地仓库,如图

JAVA之File类 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件

package ioTest.io3; import java.io.File; /* * 获取一个目录下的所有文件夹和文件,包括子文件夹和子文件 . * 并将文件夹和文件名称打印在控制台上面.并且要显示文件目录的层级 * 注:运用了递归的算法. */ public class FileDemo3 { public static void main(String[] args) { File dir=new File("F:\\黑马学习日程\\"); //File dir=new Fi

获取列表中某一个文件夹下的列表项集合(不包含子文件夹对象,也不包含子文件夹中的列表项)

RT,方法如下: 1 SPListItemCollection GetSubItemsWithoutFoldersInParrentFolder(SPFolder parrent) 2 { 3 SPList list = parrent.Item.ParentList; 4 SPQuery query = new SPQuery(); 5 query.Folder = parrent; 6 query.Query = "<Where><Eq><FieldRef Na

在存放源程序的文件夹中建立一个子文件夹 myPackage。例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage)。在 myPackage 包中创建一个YMD类,该类具有计算今年的年份、可以输出一个带有年月日的字符串的功能。设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名、年龄、出生日期。程序使用YM

题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在"D:\java"文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 myPackage 包中创建一个YMD类,该类具有计算今年的年份.可以输出一个带有年月日的字符串的功能.设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名.年龄.出生日期.程序使用YMD的方法来计算年龄. 主要考包的运用 用到java.util.Calendar

键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:&quot;java&quot;,&quot;txt&quot;)作为key, 用个数作为value,放入到map集合中,遍历map集合

package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Scanner;import java.util.Set; /** 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt&qu

git分支合并、撤销;git修改已push的commit信息; git 撤销操作;

git分支合并 1.分支代码提交 2.git branch 查询本地分支 3.git checkout 分支名1 切换分支到需要合并的分支上 4.git merge 分支名2  //选择要合并到 分支名1 的分支名2 eg: 如果develop_screen分支合并到develop分支上,这个时候切换到develop分支上, git merge develop_screen 5.合并之后可能会有冲突,可用git status 查看冲突代码 <<<<<<<  ===

github仓库的建立及本地仓库的推送

一.github仓库的建立 1.进入github网站(https://github.com/),并登陆账号 2.点击上图右下角的“+New repository”控件,进入以下界面: 3.输入上图中的相关信息后,点击Create repository控件后便创建了一个新的git repository. 二.本地仓库的建立 配置用户信息 git config --global user.name  "kwgqjj" git config --global user.email  [ema

重装win8系统后分区全部合并到一个盘别的分区的文件怎么恢复

重装系统后只有一个盘是由于在重装系统时,选择了错误的选项导致把整个硬盘当成C盘来装,装完之后自然就只剩下C盘.想要恢复丢失分区的文件,需要注意,别往现在的这个C盘存入新的文件(因为现在存入的文件可能会覆盖原先DEF盘的文件).可以把硬盘拆下来挂到别的电脑当从盘或者接个移动硬盘,把数据恢复到移动硬盘里.具体的恢复方法看下文了解. 工具/软件:流星数据恢复软件 步骤1:先下载并解压程序运行后,直接双击需要恢复的分区,接着右击软件图标选择<以管理员身份运行>(如果是xp系统可以直接双击打开软件).

系统ghost后分区全部合并到一个盘别的分区的文件怎样找到

GHOST只剩C盘是因为在ghost系统时,选择了错误的选项导致把整个硬盘当成C盘来装,装完之后自然就只剩下一个盘.想要恢复丢失盘的资料,需要注意,别往现在的这个C盘存入新的文件(因为现在存入的文件可能会覆盖原先DEF盘的资料).可以把硬盘拆下来挂到别的电脑当从盘或者接个移动硬盘,把数据恢复到移动硬盘里.具体的恢复方法看下文了解. 工具/软件:AuroraDataRecovery 步骤1:先下载并解压程序打开后,直接双击需要恢复的分区,然后右击软件图标选择<以管理员身份运行>(如果是xp系统可