我如何制作一个git冲突总是通过获取最新的文件(最新更改的时间戳)得到解决,在没有提示的情况下完成?
我正在使用git后端构建一个syncscript,我从不想实际合并文件,只是覆盖所有旧版本与最后编辑/删除/添加的版本.
编辑:使用最新文件,我的意思是包含该文件的最新提交.
我找到了这个小合并驱动程序,它做了我想要的.为了我的目的,它被硬编码到"主"分支和"原点"遥控器.我不知道如何使这些部件动态化.
#!/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)