问题背景:
    最近在重新整理手中的一个项目,目前该项目分为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仓库的文件到本地仓库里某个指定子文件夹并不丢失远程提交记录?
 
我这样获取远程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”
 
以下为真实测试的信息:
  1. 在本地新建Git仓库
  2. 在新仓库添加文件和更改,产生提交历史(也可以创建分支,Tag等)
  3. 在本地创建新分支并切换(栗子中直接在master操作的)
  4. 使用“git remote add -f demo2 f:\demo\d2”添加远程仓库 (demo2为远程仓库名, f:\demo\d2为远程仓库地址),将会获取远程提交历史,但没有远程文件
  5. 使用“git subtree add --prefix=d/2  f:\demo\d2 master --squash”引入外部仓库, --prefix=d/2 为在本地创建的子目录(子目录如果存在需要删除),后面是远程地址和分支名, 将会pull远程文件到本地目录如f:\w\d\2
  6. 使用“git merge -s subtree demo2/master”合并远程分支到当前分支,demo2/master 为 远程仓库/远程分支名
  7. 使用“git remote remove demo2”删除远程仓库分支,并删除合并自远程仓库的所有分支和Tag(不删除会出现 "demo2/master"这样的分支和Tag)
  8. 在本地进行操作,提交commit .....
 
 
使用“git remote remove demo2”删除远程仓库分支
 
 
感谢群里的朋友和网上的资料!
 
参考:

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

 

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

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

    package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import ...

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

    题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 m ...

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

    转载请注明出处 http://www.goteny.com/articles/2014/06/136.html http://www.cnblogs.com/zjjne/p/3778640.html ...

  4. git只合并某一个分支的某个commit

    第一种情况:只合并一个commit git checkout develop-hbb git cherry-pick 7c32be61 以上,7c32be61是develop上的一个fix bug的c ...

  5. git提交空文件夹和删除远程文件

    git提交空文件夹 在文件夹中创建 .gitkeep 文件,文件内容如下 # Ignore everything in this directory * # Except this file !.gi ...

  6. git强制合并另一个分支

    New分支和Old分支都修改了同样的部分,有冲突,但是想在Old分之上合并New分支的内容,并且以New分支为主,就是不自己手动解决冲突,碰到冲突,直接以New分支为主. 参考 https://git ...

  7. Git拉取远程仓库代码并更新本地仓库

    1.git pull:获取最新代码到本地,并自动合并到当前分支 //查询当前远程分支 $ git remote -v //直接拉取并合并最新代码 $ git pull origin master [示 ...

  8. Git 将子文件夹分离为一个新的库

    前面的需求 公司Android的项目上,想要将一些module抽取出来,作为一个可以被其它项目上使用的. 所以使用了git submodule的方案. 为了将代码库中的一个文件夹分离后,作为一个单独的 ...

  9. 通过创建临时表合并某一个库的hive小文件

    #!/bin/bash #需要指定hive中的库名 #set -x set -e DB=$1 if [ -z $1 ];then echo "Usage:$0 DbName" ex ...

随机推荐

  1. Hadoop化繁为简(一)-从安装Linux到搭建集群环境

    简介与环境准备 hadoop的核心是分布式文件系统HDFS以及批处理计算MapReduce.近年,随着大数据.云计算.物联网的兴起,也极大的吸引了我的兴趣,看了网上很多文章,感觉还是云里雾里,很多不必 ...

  2. Windows 10原版ISO下载地址(持续更新)

    Windows 10本质上,它们与 Win7.XP 时代的 SP1.SP2.SP3 这样的大型更新版是一样的,只不过微软很蛋疼地为它们起上一个难记地要死的名字,仅此而已.如果你把“一周年更新”看作 S ...

  3. CentOS下GPT分区(转)

    GPT格式的分区理论上是支持18EB,而MBR只支持2TB,以后大硬盘GPT是趋势.fdisk最大只能建立2TB大小的分区,创建一个大于2TB的分区就必须使用parted,parted向后兼容MBR. ...

  4. 12174 - Shuffle

    这道题能够用"滑动窗体"的思想来做,假想一个滑动的窗体,这个窗体的大小是s.划过一个大小为n的区域,可是由于s可能比n大,所以我们最好还是不去考虑s和n的大小,直接开出一个足够大的 ...

  5. LDO current regulator for power LED

    LDO current regulator for power LED Challenge You've got a power LED? Great! Build a flash light! Wh ...

  6. lex yacc flex bison

    lex与yacc是两个在Unix下的分别作词法分析和语法分析的工具, Linux对应flex与bison. windows:http://sourceforge.net/projects/unxuti ...

  7. chrome主页被hao123篡改,怎么改回来?

    这两天因为下载个别小程序又把我的chrome的主页给篡改了,由于我现在使用的是任务栏快捷方式,没法右键属性,但我想应该和桌面快捷方式是一个道理,于是我找到任务栏文件夹C:\Users\Administ ...

  8. Delphi判断文件是否正在被使用

    首先,我们先来认识下CreateFile函数,它的原型如下   HANDLE CreateFile( LPCTSTR lpFileName,    //指向文件名的指针 DWORD dwDesired ...

  9. ListBox使用

    一.什么是ListBox? ListBox 是一个显示项集合的控件.一次可以显示 ListBox 中的多个项. ListBox继承自ItemsControl,可以使用Items或者ItemsSourc ...

  10. 高通与MTK瓜分天下?手机处理器品牌分析

    http://mobile.pconline.com.cn/337/3379352.html [PConline 杂谈]如果你向朋友请教买一台怎样的台式机或者笔记本的话,很多时候那朋友会根据你对电脑的 ...