使用子樹合并策略更新git項目的部分目錄

背景

正在開發的一個項目中引用了第三方庫的源碼,由于歷史原因,源碼的引用并不是很規范(直接下載下來后作為自己項目的部分源碼使用,還進行了一些修改),具體如下:

  1. 我有一個本地git項目project_local,其基本目錄結構如下:
    project_local
    |-- CHANGELOG.md
    |-- CMakeLists.txt
    |-- README.md
    |-- jsoncpp
    |   |-- CMakeLists.txt
    |   |-- json
    |   `-- jsoncpp.cpp
    |-- thread_pool.h
    `-- vpf|-- CMakeLists.txt|-- FindVPF.cmake|-- PyNvCodec|-- PytorchNvCodec|-- VideoCapture.cpp|-- VideoCapture.h|-- VideoWriter.cpp`-- VideoWriter.h
    
    其中,vpf/PyNvCodec、vpf/PytorchNvCodec均為目錄,下面還有子目錄和各種文件,正是這兩個目錄來源于開源項目
  2. 線上github源碼工程為project_online,其基本目錄結構為:
    project_online
    |-- CMakeLists.txt
    |-- LICENSE
    |-- PyNvCodec
    |   |-- CMakeLists.txt
    |   |-- TC
    |   |-- inc
    |   |-- pybind11-2.1.1
    |   `-- src
    |-- PytorchNvCodec
    |   |-- CMakeLists.txt
    |   `-- src
    |-- README.md
    |-- SampleDecode.py
    |-- SampleDecodeMultiThread.py
    |-- SampleDecodeSw.py
    |-- SampleDemuxDecode.py
    |-- SampleEncode.py
    |-- SampleEncodeMultiThread.py
    |-- SamplePyTorch.py
    |-- SampleTensorRTResnet.py
    |-- SampleTorchResnet.py
    `-- Tests.py
    
  3. project_local項目中的vpf目錄使用了project_online工程,即vpf/PyNvCodec、vpf/PytorchNvCodec兩個目錄均來源于project_online項目下的PyNvCodec和PytorchNvCodec
  4. 具體需要求是:project_online項目有更新了(新版本v1.1),我想把這些更新應用在vpf/PyNvCodec、vpf/PytorchNvCodec這兩個目錄上,其他文件和目錄均保持不變

實現方法

推薦方法:推薦方法:使用子樹合并策略 (Subtree Merge)

# 進入本地項目目錄
cd /path/to/project_local# 1. 添加原始倉庫為遠程源
git remote add online https://github.com/original-owner/project_online.git
git fetch online# 2. 選擇要合并的版本(標簽或分支)
TARGET_VERSION="v1.1"  # 替換為實際版本# 3. 更新 PyNvCodec
git subtree pull --prefix=vpf/PyNvCodec online $TARGET_VERSION -m "Update PyNvCodec to $TARGET_VERSION"# 4. 更新 PytorchNvCodec
git subtree pull --prefix=vpf/PytorchNvCodec online $TARGET_VERSION -m "Update PytorchNvCodec to $TARGET_VERSION"# 5. 保留本地修改的文件(根據情況看是否執行)
git checkout HEAD -- vpf/PyNvCodec/local_settings.py
git checkout HEAD -- vpf/PytorchNvCodec/custom_config.h

這種方法確保:

  1. 精確更新指定目錄
  2. 保留本地其他文件的修改
  3. 維護清晰的提交歷史
  4. 支持后續持續更新
  5. 提供沖突解決機制

其他

關于git subtree pull 命令詳解:

git subtree pull --prefix=vpf/PyNvCodec online $TARGET_VERSION -m "Update PyNvCodec to $TARGET_VERSION" 這個命令是 Git 子樹策略的核心操作之一,下面我將詳細解釋其工作原理和每個參數的作用。

命令結構解析

命令部分說明
git subtree pull子樹拉取操作
--prefix=vpf/PyNvCodec指定本地目標目錄
online遠程倉庫別名
$TARGET_VERSION要拉取的遠程版本(分支/標簽)
-m "Update PyNvCodec to $TARGET_VERSION"合并提交信息

工作原理詳解

1. 子樹合并的本質

git subtree 是一種將外部倉庫作為子目錄集成到當前倉庫的策略。與子模塊不同,子樹的內容直接屬于主倉庫,不需要額外的引用文件。

2. 命令執行流程

當執行 git subtree pull 時,Git 會執行以下操作:

  1. 創建臨時分支:在后臺創建一個臨時分支,包含遠程倉庫指定版本的內容
  2. 提取子樹歷史:從臨時分支中提取與指定目錄相關的提交歷史
  3. 重寫路徑:將遠程路徑重寫為本地 --prefix 指定的路徑
    • 遠程:PyNvCodec/file.txt → 本地:vpf/PyNvCodec/file.txt
  4. 合并到當前分支:將重寫后的提交合并到當前分支
  5. 創建合并提交:使用 -m 指定的消息創建合并提交
  6. 清理臨時對象:刪除臨時分支和相關對象

3. 路徑映射機制

原始遠程結構:         本地映射后結構:
PyNvCodec/            vpf/PyNvCodec/
├── src/              ├── src/
├── inc/              ├── inc/
└── CMakeLists.txt    └── CMakeLists.txt

Git 會自動處理路徑轉換,確保遠程文件放入正確的本地目錄。

關鍵特性與優勢

1. 歷史保留

  • 保留完整的提交歷史(包括作者、日期等信息)
  • 可以通過 git log vpf/PyNvCodec 查看子樹歷史
  • 保持原始提交哈希不變(通過重寫實現)

2. 雙向同步

  • 拉取更新git subtree pull
  • 推送修改git subtree push --prefix=... online branch
  • 允許將本地修改推送回原始倉庫

3. 沖突處理

當子樹目錄有本地修改時:

  1. Git 會自動嘗試合并
  2. 如果自動合并失敗,會暫停并提示解決沖突
  3. 解決沖突后使用 git commit 完成合并

4. 與普通合并的區別

特性git subtree pull普通 git merge
影響范圍僅指定目錄整個倉庫
歷史處理重寫路徑后保留原始歷史保留原始路徑
沖突概率更低(僅限子樹目錄)更高(整個倉庫)
工作目錄不需要干凈狀態需要干凈狀態

使用示例場景

初始添加子樹

# 首次添加子樹(創建初始提交)
git subtree add --prefix=vpf/PyNvCodec online v1.0.0 -m "添加PyNvCodec v1.0.0"

更新子樹

# 更新到新版本
git subtree pull --prefix=vpf/PyNvCodec online v1.2.0 -m "更新PyNvCodec到v1.2.0"

處理沖突

# 如果發生沖突
git mergetool -t vscode  # 使用VS Code解決沖突
git commit -m "解決PyNvCodec合并沖突"

查看子樹歷史

git log --graph --oneline --decorate -- vpf/PyNvCodec

高級選項

1. 壓縮歷史 (--squash)

git subtree pull --prefix=... --squash -m "更新"
  • 優點:創建一個合并提交,不引入外部歷史,保持倉庫整潔
  • 缺點:丟失詳細提交歷史,無法追溯子樹內部變更

2. 指定合并策略

git subtree pull --prefix=... -X theirs  # 優先使用遠程版本
git subtree pull --prefix=... -X ours    # 優先使用本地版本

3. 拆分子樹歷史

# 查看子樹歷史
git subtree split --prefix=vpf/PyNvCodec --rejoin

常見問題解決方案

  1. 目錄不存在錯誤

    mkdir -p vpf/PyNvCodec  # 確保目標目錄存在
    touch vpf/PyNvCodec/.gitkeep  # 添加占位文件
    git add vpf/PyNvCodec/.gitkeep
    git commit -m "創建PyNvCodec目錄"
    
  2. 權限拒絕錯誤

    # 確保沒有未提交的修改
    git status# 暫存當前修改
    git stash# 執行子樹拉取
    git subtree pull ...# 恢復暫存修改
    git stash pop
    
  3. 大型倉庫優化

    # 淺層克隆歷史
    git subtree pull --prefix=... --squash# 限制歷史深度
    git config subtree.online.shallow true
    

與替代方案的比較

方案優點缺點
子樹策略無需外部依賴,完整歷史學習曲線較陡峭
子模塊明確分離,易于更新需要額外命令,協作復雜
手動復制簡單直觀丟失歷史,難以更新
倉庫合并保留完整歷史污染主倉庫歷史

git subtree pull 是管理項目內嵌外部代碼庫的專業解決方案,特別適合需要保留歷史同時精確控制更新范圍的情況。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85921.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85921.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85921.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pikachu通關教程-CSRF

CSRF(get) 用bp進行抓包 選擇action value值的修改 點擊test in browser copy然后放在bp代理的瀏覽器上,會出現一個提交按鈕,這時候點擊之后信息就被修改了。 CSRF(post) 請求的方式不同,其他都是一樣 CSRF Token 存在cookie 首先要先下載一…

AI驅動游戲開發:Unity與ML-Agents結合

AI驅動游戲開發:Unity與ML-Agents結合 系統化學習人工智能網站(收藏):https://www.captainbed.cn/flu 文章目錄 AI驅動游戲開發:Unity與ML-Agents結合摘要引言技術架構與開發流程1. Unity與ML-Agents協同機制2. 開發…

如何給windos11 擴大C盤容量

動不動C盤就慢了,蘋果逼著用戶換手機,三天兩頭更新系統,微軟也是毫不手軟。c盤 從10個G就夠用,到100G 也不夠,看來通貨膨脹是部分行業的。 在 Windows 11 中擴大 C 盤容量,主要取決于磁盤分區布局和可用空…

Kafka入門-消費者

消費者 Kafka消費方式:采用pull(拉)的方式,消費者從broker中主動拉去數據。使用pull的好處就是消費者可以根據自身需求,進行拉取數據,但是壞處就是如果Kafka沒有數據,那么消費者可能會陷入循環…

SpringBoot自動化部署實戰技術文章大綱

技術背景與目標 介紹SpringBoot在現代開發中的重要性自動化部署的價值:提升效率、減少人為錯誤、實現CI/CD適用場景:中小型Web應用、微服務架構 自動化部署核心方案 基于Docker的容器化部署 SpringBoot應用打包為Docker鏡像使用Docker Compose編排多容…

TDengine 集群運行監控

簡介 為了確保集群穩定運行,TDengine 集成了多種監控指標收集機制,并通過 taosKeeper 進行匯總。taosKeeper 負責接收這些數據,并將其寫入一個獨立的 TDengine 實例中,該實例可以與被監控的 TDengine 集群保持獨立。TDengine 中的…

C# 委托UI控件更新例子,何時需要使用委托

1. 例子1 private void UdpRxCallBackFunc(UdpDataStruct info) {// 1. 前置檢查防止無效調用if (textBoxOutput2.IsDisposed || !textBoxOutput2.IsHandleCreated)return;// 2. 使用正確的委托類型Invoke(new Action(() >{// 3. 雙重檢查確保安全if (textBoxOutput2.IsDis…

[10-2]MPU6050簡介 江協科技學習筆記(22個知識點)

1 2 3 歐拉角是描述三維空間中剛體或坐標系之間相對旋轉的一種方法。它們由三個角度組成,通常表示為: ? 偏航角(Yaw):繞垂直軸(通常是z軸)的旋轉,表示偏航方向的變化。 ? 俯仰角&a…

虛擬環境共享系統包

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 虛擬環境共享系統包 python basic_pipelines/detection.py如果報錯顯示如下: Traceback (most recent call last):File "/home/ai/hailort/hailo-rpi5-exam…

Java求職者面試題解析:基礎概念、計算機基礎與源碼原理

Java求職者面試題解析:基礎概念、計算機基礎與源碼原理 第一輪:基礎概念問題 1. 什么是Java的跨平臺特性? Java的跨平臺特性是指Java程序可以在任何支持Java虛擬機(JVM)的設備上運行,而無需重新編譯。這…

網頁前端開發(基礎進階4--axios)

Ajax Ajax(異步的JavaScript和XML) 。 XML是可擴展標記語言,本質上是一種數據格式,可以用來存儲復雜的數據結構。 可以通過Ajax給服務器發送請求,并獲取服務器響應的數據。 Ajax采用異步交互:可以在不重新加載整個頁面的情況下&am…

設計模式-迪米特法則

迪米特法則 迪米特法則 (Law of Demeter, LoD),也被稱為“最少知識原則 (Principle of Least Knowledge)”,是面向對象設計中的一個重要原則。 核心思想:一個對象應該對其他對象有盡可能少的了解。 更具體地說,它規定了一個對象…

結構性-代理模式

動態代理主要是為了處理重復創建模板代碼的場景。 使用示例 public interface MyInterface {String doSomething(); }public class MyInterfaceImpl implements MyInterface{Overridepublic String doSomething() {return "接口方法dosomething";} }public class M…

Unity大型項目資源框架

?? Unity大型項目資源管理:低端機檢測后自動切換資源框架(大廠風格) ?? 框架目標 ? 啟動時檢測機型性能,判定設備等級 ? 同一資源有高配/中配/低配不同壓縮格式 ? 根據設備等級,加載對應資源包(AB) ? 支持動態切換(可用來切換特效/貼圖分辨率/模型LOD) ? 保證…

MATLAB仿真:偏振光在光纖通信中的應用研究_可復現,有問題請聯系博主

MATLAB仿真:偏振光在光纖通信中的應用研究 1. 研究概述 本文通過MATLAB仿真研究偏振光在光纖通信中的關鍵技術,包括偏振態生成、傳輸特性和檢測方法,重點分析偏振模色散(PMD)的影響機制,并設計偏振控制優化方案。 %% 主程序框架 clc; clear; close all; addpath(Polar…

CTA-861-G-2017中文pdf版

CTA-861-G標準(2016年11月發布)規范未壓縮高速數字接口的DTV配置,涵蓋視頻格式、色彩編碼、輔助信息傳輸等,適用于DVI、HDMI等接口,還涉及EDID數據結構及HDR元數據等內容。

C++核心編程_繼承方式

繼承的語法&#xff1a;class 子類 : 繼承方式 父類 繼承降屬性權限&#xff0c;不可升屬性權限 繼承方式一共有三種&#xff1a; 公共繼承 保護繼承 私有繼承 #include <iostream> #include <string> using namespace std;class Base1 { public:int m_A; p…

Dockerfile常用指令介紹

Dockerfile常用指令介紹 Dockerfile是一個文本文件&#xff0c;用于定義Docker鏡像的構建過程。下面介紹一些最常用的Dockerfile指令及其用法&#xff1a; 基礎指令 FROM - 指定基礎鏡像 FROM python:3.9-slim這是Dockerfile的第一個指令&#xff0c;用于指定構建鏡像的基礎鏡…

Spring中@Primary注解的作用與使用

在 Spring 框架中&#xff0c;Primary 注解用于解決依賴注入時的歧義性&#xff08;Ambiguity&#xff09;問題。當 Spring 容器中存在多個相同類型的 Bean 時&#xff0c;通過 Primary 標記其中一個 Bean 作為默認的首選注入對象。 核心作用&#xff1a; 解決多個同類型 Bean …

本地優先的狀態管理與工具選型策略

本地優先&#xff1a;合理把控狀態共享邊界 在 React 應用開發過程中&#xff0c;開發者容易陷入一個認知誤區——過度追求狀態的全局化。許多新手開發者在項目初期就急于引入 Redux、Zustand 或 Jotai 等狀態管理工具&#xff0c;將一些本應屬于組件內部的瑣碎狀態&#xff0…