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倉庫的文件到本地倉庫里某個指定子文件夾並不丟失遠程提交記錄?
 
我這樣獲取遠程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
 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM