Git合并冲突始终采用最新文件

Lil*_*man 6 git git-merge

我如何制作一个git冲突总是通过获取最新的文件(最新更改的时间戳)得到解决,在没有提示的情况下完成?

我正在使用git后端构建一个syncscript,我从不想实际合并文件,只是覆盖所有旧版本与最后编辑/删除/添加的版本.

编辑:使用最新文件,我的意思是包含该文件的最新提交.

Lil*_*man 6

我找到了这个小合并驱动程序,它做了我想要的.为了我的目的,它被硬编码到"主"分支和"原点"遥控器.我不知道如何使这些部件动态化.

#!/usr/bin/env sh
if git merge-file -p -q "$2" "$1" "$3" > /dev/null;
        then git merge-file "$2" "$1" "$3";
        else
                MINE=$(git log --format="%ct" --no-merges master -1);
                THEIRS=$(git log --format="%ct" --no-merges origin/master -1);
                if [ $MINE -gt $THEIRS ];
                        then git merge-file -q --ours "$2" "$1" "$3";
                        else git merge-file -q --theirs "$2" "$1" "$3";
                fi
fi
Run Code Online (Sandbox Code Playgroud)

简而言之,我寻找最后一次使用git-log而不是合并,格式化为UNIX时间戳,然后我比较它们并运行自定义git-merge与eiter我们或他们的版本.

作为一点奖励,它首先检查是否可以合并文件而不会发生冲突.如果可以,它会合并两个文件.


小智 2

基于@Lilleman的答案,这个答案很好,但有一个错误:如果在比origin/master更旧的本地master上修改了一个文件,则预期的行为是选择origin/master,但是如果您在本地master上添加提交,它将选择文件的本地(旧版本)。git log 需要使用一个额外的参数来执行,即文件路径。

这是一个更好的版本,包括可变分支名称,它有点 hacky,但它可以工作

合并

#!/bin/sh
cd `findup .git`
PATH=$PATH:$( dirname "${BASH_SOURCE[0]}" )
HEAD=`git rev-parse --abbrev-ref HEAD`

echo "* merge=newest" > .gitattributes
sed -ie '/merge "newest"/,+2d' .git/config
echo "[merge \"newest\"]" >> .git/config
echo -e "\tname = Merge by newest commit" >> .git/config
echo -e "\tdriver = git-merge-newest %O %A %B %L %P $HEAD $1" >> .git/config
git merge $1
sed -ie '/merge "newest"/,+2d' .git/config
rm .gitattributes
cd - 
Run Code Online (Sandbox Code Playgroud)

git 合并最新

#!/bin/sh
if git merge-file -p -q "$2" "$1" "$3" > /dev/null;
        then git merge-file "$2" "$1" "$3";
        else
                MINE=$(git log --format="%ct" --no-merges "$6" -1 $5);
                THEIRS=$(git log --format="%ct" --no-merges "$7" -1 $5);
                if [ $MINE -gt $THEIRS ]; then
                  git merge-file -q --ours "$2" "$1" "$3" >/dev/null
                else
                  git merge-file -q --theirs "$2" "$1" "$3">/dev/null
                fi
fi
Run Code Online (Sandbox Code Playgroud)

使用查找

#!/bin/sh

pwd="`pwd`"
start="$pwd"
while [ ! "$pwd" -ef .. ]; do
[ -e "$1" ] && echo -n "$pwd" && exit
cd .. || exit 1
pwd="`pwd`"
done
exit 1
Run Code Online (Sandbox Code Playgroud)