我的软件开发伙伴们大家好,
我的 git 存储库中有两个具有不同 .gitignore 文件的分支,
develop
和 feature/my_feature
。有些文件存在于 feature/my_feature
中但不存在于 develop
中。
将分支 feature/my_feature
合并回 develop
分支时,我希望自动排除 develop
分支中尚未存在的文件。
我尝试了 Git Book 中相应章节以及 StackOverflow 帖子 Git - 在合并期间忽略文件中提出的策略,但是 develop
分支中缺少的文件会导致发生冲突,即不会自动解决。我还尝试了 StackOverflow 帖子
(Git Merging)何时使用“我们的”策略、“我们的”选项和“他们的”选项?中提出的策略,使用以下 bash 脚本custom-merge.sh
(已放置在用于测试目的的我的存储库的根目录)用于定义的策略
custom
:
#!/bin/sh
# Custom merge script to handle conflicts caused by files not present in current branch
# Check if the file exists in the current branch
if test -e "$1"; then
# File exists in current branch, use default merge strategy
git merge-file "$1" "$2" "$3"
else
# File does not exist in current branch, keep file from branch being merged
git checkout --theirs -- "$1"
git add "$1"
fi
我使用以下命令将该策略添加到我的存储库中:
git config --local merge.custom.name "Custom merge driver to handle conflicts caused by files not present in current branch"
git config --local merge.custom.driver "custom-merge.sh %O %A %B"
此外,当尝试将策略添加到全局 git 配置并使用 custom-merge.sh
的完整路径时,git 返回以下错误:
Could not find merge strategy 'custom'.
Available strategies are: octopus ours recursive resolve subtree.
如何将分支 feature/my_feature
合并回
develop
分支,同时自动从合并中排除
develop
分支中尚未存在的文件?
编辑2023年10月24日08:35:
我不知道这是否重要,但我正在使用 git 2.35.1.windows.2 在 Windows 10 22H2 上工作。
最好的, 弗朗西斯科
将以下代码放入
pre-merge-commit
挂钩中会在合并之前删除忽略的文件:
git restore --staged --worktree -- *.gitignore
git rm --cached --ignore-unmatch $(git ls-files --cached --ignored --exclude-standard)
解释
git restore --staged --worktree -- *.gitignore
恢复目标分支中的所有
.gitignore
文件。
git rm --cached --ignore-unmatch $(git ls-files --cached --ignored --exclude-standard)
删除所有
.gitignore
文件中存在的所有暂存文件
缺点
这相当于清理工作树,这可能是不需要的。