You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git镜像同步时忽略/截断大文件的远程推送方案咨询

解决方案:用Git自定义过滤器实现大文件自动截断同步

针对你的需求,推荐使用Git smudge/clean过滤器在本地仓库自动将指定大文件替换为0字节,既保留完整提交历史(仅修改大文件内容),又能避开hostB的大小限制拦截,且无需每次重新克隆仓库。

操作步骤(仅首次配置需执行,后续同步复用仓库)

1. 初始化本地仓库并配置过滤器

  • 克隆hostA的仓库并添加hostB远程:
    git clone hostA:repo1.git
    cd repo1
    git remote add hostB hostB:repo1.git
    
  • 在本地仓库创建处理脚本truncate-large-files.sh,用于将指定大文件转为0字节:
    #!/bin/sh
    # 替换为实际需要处理的大文件路径,多个文件用空格分隔
    LARGE_FILES="path/to/large1.bin path/to/large2.zip"
    for file in $LARGE_FILES; do
        if [ -f "$file" ]; then
            truncate -s 0 "$file"
        fi
    done
    
  • 赋予脚本执行权限:
    chmod +x truncate-large-files.sh
    
  • 在仓库的.git/config中添加自定义过滤器配置:
    [filter "truncate-large"]
        clean = ./truncate-large-files.sh
        smudge = cat
    
  • 创建/修改.gitattributes文件,指定需要应用过滤器的文件:
    path/to/large1.bin filter=truncate-large
    path/to/large2.zip filter=truncate-large
    

2. 首次同步到hostB

  • 拉取hostA的main分支和所有标签:
    git pull hostA main --tags
    
  • 过滤器会自动将指定大文件转为0字节,强制推送到hostB(因历史内容被修改,需强制推送):
    git push hostB main --force
    git push hostB --tags
    

3. 每月同步流程

  • 拉取hostA的最新更新:
    git pull hostA main --tags
    
  • 过滤器自动处理新提交中的大文件,直接强制推送更新到hostB:
    git push hostB main --force
    git push hostB --tags
    

方案优势

  • 无需每次重新克隆仓库,本地仓库可长期复用
  • 拉取hostA更新时,大文件始终保持0字节与本地一致,不会产生冲突
  • 完整保留提交历史结构(仅修改大文件内容),标签同步不受影响

备选方案:单次历史重写(适合极低更新频率场景)

如果不想维护过滤器配置,可在每次同步时基于hostA最新代码做单次历史重写,仅修改大文件内容而非移除:

# 克隆或拉取hostA最新代码
git clone hostA:repo1.git
cd repo1
git remote add hostB hostB:repo1.git

# 重写历史,将指定大文件替换为0字节
git filter-branch --tree-filter 'truncate -s 0 path/to/large1.bin path/to/large2.zip' -- main

# 强制推送和标签同步
git push hostB main --force
git push hostB --tags

内容的提问来源于stack exchange,提问作者Ludo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:52:50