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

Git合并两个仓库时未同步文件删除问题排查

解决Git同步时无法同步上游删除操作且保留自有文件的问题

问题分析

你遇到的核心问题是:Git的合并策略默认会保留本地(仓库B)已存在的文件,即使上游(仓库A)已删除该文件。因为当B中存在该文件的提交记录时,合并会认为本地版本需要保留;而subtree策略会将整个目录视为同步范围,导致误删B的自有文件。

解决方案

通过先同步上游删除操作,再合并新增/更新内容的方式,既同步A的删除动作,又保留B独有的文件。具体步骤如下:

  1. 获取上游仓库的最新代码
  2. 对比上游分支与本地分支,筛选出上游已删除但本地仍存在的文件(排除本地独有的文件)
  3. 删除这些文件并提交
  4. 执行合并操作同步上游的新增和更新内容

修改后的脚本

#!/bin/sh
set -ex

# 配置Git用户信息,避免提交身份错误
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git config --global user.name "github-actions"

# 添加上游仓库并拉取最新代码
git remote add upstream https://github.com/gomisha/repo-sync-test-public
git remote -v
git fetch upstream --quiet

# 找出上游已删除但本地存在的文件(排除本地独有的文件)
# 逻辑:先筛选上游已删的文件,再排除那些上游从未存在过的本地自有文件
DELETED_FILES=$(git diff --name-only --diff-filter=D upstream/main HEAD | grep -vFf <(git ls-files --others --exclude-standard))

# 如果存在需要同步删除的文件,执行删除并提交
if [ -n "$DELETED_FILES" ]; then
  git rm $DELETED_FILES
  git commit -m "Sync deleted files from upstream"
fi

# 合并上游的新增和更新内容,用theirs策略处理冲突
git merge --no-edit -s ort -Xtheirs --allow-unrelated-histories upstream/main

# 推送到仓库B
git push

关键逻辑说明

  • git diff --name-only --diff-filter=D upstream/main HEAD:筛选出上游已删除但本地仍保留的文件
  • git ls-files --others --exclude-standard:列出本地独有的、上游从未存在过的文件
  • grep -vFf:排除本地自有文件,确保只删除上游曾经存在现在已删除的文件
  • 先提交删除操作再合并,避免合并时因本地存在文件记录而保留已删除的内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:15:34