背景
unity 项目开发时,由于我本机的配置和项目组其他小伙伴的配置不一样,使用统一的配置打开项目会出现花屏的现象,经过摸索尝试,需要修改 unity 的Project Settings。修改之后,项目文件会有变更,若是提交,其他小伙伴 pull 之后会导致他们的工程不可用。所以我只能本地修改这个文件,且不能将该文件的变更提交到项目当中。
问题解决
尝试1
git update-index --assume-unchanged ProjectSettings/ProjectSettings.asset
本地设置忽略 ProjectSettings 文件没有发生变更,这样 pull ,push 代码都没有问题,但是切换分支就会产生冲突。每次切换分支就需要解决冲突,还是很麻烦。
尝试2
git 指令支持 hook,我只需要每次切换分支前将 ProjectSettings 还原,切换分支后再修改 ProjectSettings 文件,并重新设置本地忽略 ProjectSettings 文件的变更,就可以实现我想要的功能。
但实际测试下来,发现 git 并不支持 pre-checkout,只支持 post-checkout。所以这种方式也不太行。
尝试3
既然前两种方式都不行,那就只能自己写脚本来实现了,git 命令支持别名,可以将别名指向自己写的脚本。
设置checkoutscript别名
git config --global alias.checkoutscript '!sh D:\Applications\script\checkoutscript.sh'
checkoutscript脚本,假设我们的项目为 abc
#!/bin/bash
echo "run checkout script"
# 检查参数数量
if [ $# -eq 0 ]; then
echo "no params"
exit 1
fi
# 检查第一个参数
first_arg="$1"
# 如果第一个参数是 '.' 或 '-b'
if [ "$first_arg" == "." ] || [ "$first_arg" == "-b" ]; then
# 将所有参数传递给 git checkout
git checkout "$@"
exit 0
fi
# 检查remote url
remote_url=$(git remote get-url origin)
echo "$remote_url"
if [ -z "$remote_url" ]; then # 如果 URL 为空
git checkout "$@"
exit 0
fi
# 如果不是abc项目,执行checkout
if ! [[ "$remote_url" = *"abc"* ]]; then
# echo "remote URL does not contain 'abc', performing checkout with provided branch name."
git checkout "$@"
exit 0
fi
branchName=$1
if [ -z "$branchName" ]; then
echo "branchName is empty"
else
echo "branchName is not empty: $branchName"
echo "Current directory is: $(pwd)"
echo "pre checkout"
git update-index --no-assume-unchanged ProjectSettings/ProjectSettings.asset
git checkout ProjectSettings/ProjectSettings.asset
git checkout $branchName
# 变更配置文件,并本地忽略配置文件的变更
sed -i 's/m_APIs: 0b00000002000000/m_APIs: 020000000b000000/g' ProjectSettings/ProjectSettings.asset
sed -i 's/selectedPlatform: 2/selectedPlatform: 4/g' ProjectSettings/ProjectSettings.asset
git update-index --assume-unchanged ProjectSettings/ProjectSettings.asset
echo "end after checkout"
fi
这样,我每次需要切换分支的时候直接执行 git checkoutscript xxx 就可以了,也不影响 pull 和 push操作。