git
或GitHub
中是否存在一种机制,可以检测到文件007__JamesBond.txt
是爱丽丝在master分支上创建的,而鲍勃已经创建了007__TheSpyWho.txt
在功能分支上?
当Bob要将其分支与master合并时,由于忽略了第一个双下划线后的所有内容,由于逻辑前缀“ 007”重复,因此合并应标记为冲突。
理想情况下,这就像两个人都犯了007.txt
一样,这自然会标记出合并冲突。
该筛选器应仅应用于所选目录。可以将这两个文件放在同一目录中,因此我们无需进行广泛扫描即可找到重复的文件。
实际应用程序是Flyway数据库库用于维护DDL脚本的一组文件。库要求在文件名中的唯一编号后有描述。
答案 0 :(得分:1)
以.git/hooks/commit-msg
安装的此脚本在运行git commit
和git 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