Git检测到逻辑重复文件并合并失败

时间:2018-10-12 18:53:32

标签: git github

gitGitHub中是否存在一种机制,可以检测到文件007__JamesBond.txt是爱丽丝在master分支上创建的,而鲍勃已经创建了007__TheSpyWho.txt在功能分支上?

当Bob要将其分支与master合并时,由于忽略了第一个双下划线后的所有内容,由于逻辑前缀“ 007”重复,因此合并应标记为冲突。

理想情况下,这就像两个人都犯了007.txt一样,这自然会标记出合并冲突。

该筛选器应仅应用于所选目录。可以将这两个文件放在同一目录中,因此我们无需进行广泛扫描即可找到重复的文件。

实际应用程序是Flyway数据库库用于维护DDL脚本的一组文件。库要求在文件名中的唯一编号后有描述。

1 个答案:

答案 0 :(得分:1)

.git/hooks/commit-msg安装的此脚本在运行git commitgit merge时成功检测到逻辑重复。将其配置为pre-commit挂钩不适用于合并,仅适用于提交,因此最好将其安装为commit-msg

#!/bin/bash

##################################################################
# Detect flyway logical duplicates with the same numbered prefix #
##################################################################

#Place each directory to check on a new line without any commas
flywaydirs=(
  "mycomponent1/src/main/resources/db"
  "mycomponent1/src/main/resources/db"
)

#The prefix and the main name of the file are separated by __ so we'll see files like:
#V1_prefix__main_name.sql

duplicateprefixes=()
for i in "${flywaydirs[@]}"
do
  while read -r line
  do
    duplicateprefixes+=($line)
  #Ignore filenames prefixed with R__
  done < <(git ls-files $i | sort | grep -v '/R__' | sed 's/__[^__].*$//g' | uniq -d)
done

if [ ${#duplicateprefixes[@]} -ne 0 ]; then
  echo "Found duplicate flyway files:"
  for i in "${duplicateprefixes[@]}"
  do
    git ls-files ${i}__*
  done
  echo "## Aborting commit ##"
  exit 3
else
  echo "No duplicate flyway files detected. Test passed."
fi