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

Git合并冲突状态下,如何通过自定义mergetool导出目录多版本快照?

合并冲突状态下检出目录的Base/Local/Remote版本快照

要一次性获取dirA目录三个版本的完整快照并导出到临时目录,可在你的custommerge脚本中集成以下步骤:

1. 创建临时目录结构

先生成一个临时目录,并为三个版本分别创建子目录,避免文件覆盖:

# 创建临时根目录
TMP_ROOT=$(mktemp -d)
# 为三个版本创建子目录
BASE_DIR="${TMP_ROOT}/base"
LOCAL_DIR="${TMP_ROOT}/local"
REMOTE_DIR="${TMP_ROOT}/remote"
mkdir -p "${BASE_DIR}" "${LOCAL_DIR}" "${REMOTE_DIR}"

2. 获取各版本的目录Tree引用

Git在合并冲突状态下,可通过以下方式定位三个版本的dirA目录:

  • Base版本:合并的共同祖先提交中的dirA
    # 获取合并的共同祖先Commit ID
    BASE_COMMIT=$(git merge-base HEAD MERGE_HEAD)
    # 引用祖先提交中的dirA目录
    BASE_TREE="${BASE_COMMIT}:dirA"
    
  • Local版本:当前分支(HEAD)中的dirA
    LOCAL_TREE="HEAD:dirA"
    
  • Remote版本:待合并分支(MERGE_HEAD)中的dirA
    REMOTE_TREE="MERGE_HEAD:dirA"
    

3. 导出目录快照到临时目录

使用git archive将三个版本的目录Tree导出到对应临时子目录,这种方式不会修改当前工作树,避免干扰合并冲突状态:

# 导出Base版本
git archive "${BASE_TREE}" | tar -x -C "${BASE_DIR}"
# 导出Local版本
git archive "${LOCAL_TREE}" | tar -x -C "${LOCAL_DIR}"
# 导出Remote版本
git archive "${REMOTE_TREE}" | tar -x -C "${REMOTE_DIR}"

额外说明

  • 若dirA在某个版本中不存在,git archive会报错,可根据需求添加判断逻辑(如检查目录是否存在:git ls-tree --name-only "${BASE_COMMIT}" dirA >/dev/null 2>&1)。
  • 处理完二进制文件冲突后,可将最终确定的文件复制回工作树的dirA目录,然后执行git add dirA标记冲突解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:29:59