美文网首页
Git切换分支减少重复编译

Git切换分支减少重复编译

作者: 君赏 | 来源:发表于2018-11-28 18:31 被阅读54次

    在今年的时候,项目从 SVN 转移到 gitlab进行 git托管。前期没有特别的注意,后来越来越明显。

    随着后面频繁的切换分支改动 BUG,造成每次切换之后重新编译等待很久。

    这是一种极度浪费时间的等待,如果解决掉这种切换分支频繁的重新编译很有必要。

    为什么会重复编译

    因为对于 Xcode 来说,所有的缓存文件都会存在于 DerivedData目录下面。每一个缓存文件夹都会对应一个项目的路径进行索引缓存。

    我们针对同一个项目目录进行切换分支,因为对于 不同分支意味着代码不同或者是工程的配置不相同。Xcode自然需要清理掉之前分支的缓存,重新进行编译。

    我也谷歌过怎么切换 Git分支不让重复的编译,但是没有找到解决的方案。最后小组里面的 俊哥提供了方案,不同的分支就 Clone 一个新的目录就可以避免。

    脚本切换

    我们可以针对不同的分支,Clone 一份新的工程。但是我们平时切换分支找来找去,岂不是很麻烦,我们可以用脚本解决。

    脚本的逻辑

    • 设置主工程目录
    • 获取本地和网络分支
    • 获取用户选择的分支
    • 不存在就 Clone
    • 存在就打开

    switch_branch脚本

    #!/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

    #!/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

    这样我们让小伙伴运行在工程文件所在目录执行

    bash install_switch_branch.sh
    

    之后就可以打开终端输入 switch_branch享受切换分支之后不用重复编译快感了。

    image-20181128182609438

    相关文章

      网友评论

          本文标题:Git切换分支减少重复编译

          本文链接:https://www.haomeiwen.com/subject/vamzqqtx.html