在今年的时候,项目从 SVN
转移到 gitlab
进行 git
托管。前期没有特别的注意,后来越来越明显。
随着后面频繁的切换分支改动 BUG
,造成每次切换之后重新编译等待很久。
这是一种极度浪费时间的等待,如果解决掉这种切换分支频繁的重新编译很有必要。
因为对于 Xcode
来说,所有的缓存文件都会存在于 DerivedData
目录下面。每一个缓存文件夹都会对应一个项目的路径进行索引缓存。
我们针对同一个项目目录进行切换分支,因为对于 不同分支意味着代码不同或者是工程的配置不相同。Xcode
自然需要清理掉之前分支的缓存,重新进行编译。
我也谷歌过怎么切换 Git
分支不让重复的编译,但是没有找到解决的方案。最后小组里面的 俊哥
提供了方案,不同的分支就 Clone
一个新的目录就可以避免。
我们可以针对不同的分支,Clone
一份新的工程。但是我们平时切换分支找来找去,岂不是很麻烦,我们可以用脚本解决。
脚本的逻辑
Clone
#!/bin/bash
rootDir="{rootDir}"
cd $rootDir
git pull
branchNames=`git branch -a`
localBranchs=()
serverBranchs=()
# 过滤的文件夹和文件名称
filterBranchs=("GearBest" "LICENSE")
function filterBranch() {
isFilter=0
for filterBranchName in ${filterBranchs[@]}
do
isFilter=$(echo $filterBranchName | grep $1)
if [ $isFilter ]
then
isFilter=1
break
fi
done
return $isFilter
}
subBranchNames=()
# 主工程名字标识
subBranchNames+=" [GearBest主工程]"
for name in ${branchNames[@]}
do
if [ $name == "->" ]
then
continue
fi
filterBranch $name
if [ $? == 1 ]
then
continue
fi
subName=""
if [ "$(echo $name | grep "remotes/origin/")" != "" ]
then
subName=${name:15}
serverBranchs[`expr ${#serverBranchs[@]}`]=$subName
elif [ "$(echo $name | grep "origin/")" != "" ]
then
subName=${name:7}
serverBranchs[`expr ${#serverBranchs[@]}`]=$subName
else
subName=$name
localBranchs[`expr ${#localBranchs[@]}`]=$subName
fi
if [[ ! " ${subBranchNames[@]} " =~ " ${subName} " && $subName != "HEAD" ]]; then
subBranchNames[`expr ${#subBranchNames[@]}`]=$subName
fi
done
echo "请选择需要切换分支的序号:"
index=0
for name in ${subBranchNames[@]}
do
echo "[$index]" $name
index=`expr $index + 1`
done
read readIndex
subBranchName=${subBranchNames[$readIndex]}
echo $subBranchName
function isLocalBranch() {
isLocalBranch=0
for name in ${localBranchs[@]}
do
if [ $name == $1 ]
then
isLocalBranch=1
break
fi
done
return $isLocalBranch
}
gitDir=""
if [ $subBranchName == "[GearBest主工程]" ]
then
gitDir=$rootDir
else
createDir() {
if [ ! -d $1 ]
then
mkdir $1
fi
}
# 设置缓存的目录
path="/Users/$USER/Library/Caches/GearBest"
createDir $path
branch="$path/Branchs"
createDir $branch
branchNamePath="$branch/${subBranchName}"
createDir $branchNamePath
cd $branchNamePath
# 获取分支的目录
gitDir="$branchNamePath/GearBest2.6.0_9287"
if [ ! -d $gitDir ]
then
isLocalBranch $subBranchName
if [ $? == 0 ]
then
git clone --branch $subBranchName "远程分支的 git 链接"
else
git clone --branch $subBranchName --local $rootDir
fi
fi
fi
open $gitDir -a SourceTree -j
open "${gitDir}/GearBest/GearBest.xcworkspace" -a Xcode
上面的脚本一些参数 需要修改成自己自定义的
对于每个人本地的主目录是不一样的,我们可以在初始化的时候进行设置。
#!/bin/bash
echo $PWD
PWD_Lenght=${#PWD}
# 8代表你们的工程名称长度 比如我们 GearBest长度为8
sub_lenght=`expr $PWD_Lenght - 8`
echo $sub_lenght
replace_path=${PWD:0:$sub_lenght}
echo $replace_path
chmod 777 $PWD/setupSwitchBranch/ReplaceString
cp $PWD/setupSwitchBranch/switch_branch $PWD/setupSwitchBranch/switch_branch_temp
$PWD/setupSwitchBranch/ReplaceString $PWD/setupSwitchBranch/switch_branch_temp {rootDir}=$replace_path
chmod 777 $PWD/setupSwitchBranch/switch_branch_temp
mv $PWD/setupSwitchBranch/switch_branch_temp /usr/local/bin/switch_branch
echo "执行完毕 切换分支终端执行:switch_branch"
我们把修改的工具和脚本放在 setupSwitchBranch
目录下面。ReplaceString
也是我们用来替换字符串的 Swift Command Line Tools
,是因为 Shell
很菜。
这样我们让小伙伴运行在工程文件所在目录执行
bash install_switch_branch.sh
之后就可以打开终端输入 switch_branch
享受切换分支之后不用重复编译快感了。
image-20181128182609438