在今年的时候,项目从 SVN
转移到 gitlab
进行 git
托管。前期没有特别的注意,后来越来越明显。
随着后面频繁的切换分支改动 BUG
,造成每次切换之后重新编译等待很久。
这是一种极度浪费时间的等待,如果解决掉这种切换分支频繁的重新编译很有必要。
为什么会重复编译
因为对于 Xcode
来说,所有的缓存文件都会存在于 DerivedData
目录下面。每一个缓存文件夹都会对应一个项目的路径进行索引缓存。
我们针对同一个项目目录进行切换分支,因为对于 不同分支意味着代码不同或者是工程的配置不相同。Xcode
自然需要清理掉之前分支的缓存,重新进行编译。
我也谷歌过怎么切换 Git
分支不让重复的编译,但是没有找到解决的方案。最后小组里面的 俊哥
提供了方案,不同的分支就 Clone
一个新的目录就可以避免。
脚本切换
我们可以针对不同的分支,Clone
一份新的工程。但是我们平时切换分支找来找去,岂不是很麻烦,我们可以用脚本解决。
脚本的逻辑
- 设置主工程目录
- 获取本地和网络分支
- 获取用户选择的分支
- 不存在就
Clone
- 存在就打开
switch_branch脚本
代码语言:javascript复制#!/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
上面的脚本一些参数 需要修改成自己自定义的
对于每个人本地的主目录是不一样的,我们可以在初始化的时候进行设置。
初始化脚本install_switch_branch.sh
代码语言:javascript复制#!/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
很菜。
ReplaceString
这样我们让小伙伴运行在工程文件所在目录执行
代码语言:javascript复制bash install_switch_branch.sh
之后就可以打开终端输入 switch_branch
享受切换分支之后不用重复编译快感了。
image-20181128182609438