Git提交时拆分XML文件、检出时自动合并的实现方案咨询
实现Git对含硬件特定区域XML文件的版本控制方案
完全可以通过Git自定义过滤器配合钩子脚本实现需求,具体步骤如下:
1. 基础配置
- 创建本地存储文件夹
local-xmls,并加入.gitignore避免提交到仓库:mkdir local-xmls echo "local-xmls/" >> .gitignore echo "*.xml" >> .gitignore # 忽略原始完整XML文件,仅提交共享部分
2. 编写XML处理脚本
拆分脚本(split.py):提取共享部分并保存本地配置
用于提交前将完整XML拆分为共享的*-shared.xml和本地专属的*-local.xml:
import xml.etree.ElementTree as ET import os import sys LOCAL_DIR = "./local-xmls" def split_xml(input_file): # 解析完整XML文件 tree = ET.parse(input_file) root = tree.getroot() # 提取localSection并保存到本地文件 local_section = root.find('localSection') if local_section is not None: os.makedirs(LOCAL_DIR, exist_ok=True) base_name = os.path.basename(input_file) local_filename = os.path.join(LOCAL_DIR, base_name.replace('.xml', '-local.xml')) # 生成仅含localSection的XML local_root = ET.Element('xml') local_root.append(local_section) local_tree = ET.ElementTree(local_root) local_tree.write(local_filename, encoding='utf-8', xml_declaration=True) # 移除localSection,生成共享XML文件 for local in root.findall('localSection'): root.remove(local) shared_filename = input_file.replace('.xml', '-shared.xml') tree.write(shared_filename, encoding='utf-8', xml_declaration=True) if __name__ == "__main__": for file_path in sys.argv[1:]: if file_path.endswith('.xml'): split_xml(file_path)
合并脚本(merge.py):将共享文件与本地配置合并为完整XML
用于检出共享文件后,自动合并本地配置生成可直接使用的完整XML:
import xml.etree.ElementTree as ET import os import sys LOCAL_DIR = "./local-xmls" def merge_xml(shared_file): # 解析共享XML文件 shared_tree = ET.parse(shared_file) shared_root = shared_tree.getroot() # 查找对应的本地配置文件 base_name = os.path.basename(shared_file) local_filename = os.path.join(LOCAL_DIR, base_name.replace('-shared.xml', '-local.xml')) # 合并localSection(本地文件存在时) if os.path.exists(local_filename): local_tree = ET.parse(local_filename) local_root = local_tree.getroot() local_section = local_root.find('localSection') if local_section is not None: shared_root.insert(0, local_section) # 生成完整XML文件 full_filename = shared_file.replace('-shared.xml', '.xml') shared_tree.write(full_filename, encoding='utf-8', xml_declaration=True) if __name__ == "__main__": for file_path in sys.argv[1:]: if file_path.endswith('-shared.xml'): merge_xml(file_path)
3. 配置Git钩子
预提交钩子(pre-commit)
提交前自动拆分XML,仅将共享部分纳入提交:
创建.git/hooks/pre-commit文件,内容如下:
#!/bin/bash # 遍历所有待提交的XML文件 git diff --cached --name-only | grep "\.xml$" | while read -r file; do python3 split.py "$file" # 将生成的共享XML加入提交队列 git add "${file%.xml}-shared.xml" # 移除原始完整XML的提交标记 git reset HEAD "$file" done exit 0
给钩子添加执行权限:
chmod +x .git/hooks/pre-commit
检出后钩子(post-checkout)
拉取代码或切换分支后,自动合并生成完整XML:
创建.git/hooks/post-checkout文件,内容如下:
#!/bin/bash # 遍历所有共享XML文件 find . -name "*-shared.xml" -type f | while read -r file; do python3 merge.py "$file" done exit 0
添加执行权限:
chmod +x .git/hooks/post-checkout
4. 使用流程
- 开发者直接编辑生成的完整XML文件(如
foo.xml) - 执行
git add foo.xml并提交,预提交钩子会自动拆分出foo-shared.xml(提交至仓库)和foo-local.xml(存于local-xmls) - 拉取远程变更或切换分支时,post-checkout钩子会自动将仓库中的
*-shared.xml与本地local-xmls中的*-local.xml合并为完整XML - 若仅修改
localSection,拆分后的*-shared.xml无变更,Git不会提示提交
内容的提问来源于stack exchange,提问作者HugoRune
相关产品推荐
相关产品推荐

