Buenas noticias para el trastorno obsesivo-compulsivo: el script de shell implementa la función git draft

El script de Shell implementa la función de borrador de git

Git es una herramienta de administración de código muy poderosa que proporciona la función de seguimiento de versiones. Cuando se cambian diferentes dispositivos, es muy conveniente usar git para sincronizar el código. Sin embargo, a veces es necesario cambiar temporalmente a otros dispositivos para continuar escribiendo código. En este caso, el envío suele ser muy difícil y es una monstruosidad, porque es posible que el módulo que estás escribiendo sólo esté a medias. Por lo tanto, cuando escribí el código la última vez, no usé git para administrar el código, sino que usé directamente el contenedor. Planeé cargarlo en el servidor git después de la finalización final. Como resultado, el contenedor se colgó y el código se había ido.
Para evitar que este problema vuelva a suceder, decidí usar git para administrar el código nuevamente y, al mismo tiempo, para evitar que el envío fuera demasiado confuso, escribí un script de shell simple para implementar la función de borrador.

Y después de terminar de escribir, descubrí que la combinación de github tiene la función de fusionar varios envíos en uno, lo que se considera reinventar la rueda. Sin embargo, los registros de confirmación originales desordenados en la combinación aún se conservarán (aún se pueden encontrar), por lo que aún así escribí este artículo para compartir esta herramienta.

Análisis de requisitos y diseño funcional.

  1. Envíe una pregunta confusa:

Se utilizan dos almacenes, borrador y finalización. El borrador es el área de edición de código. El código generalmente se escribe bajo borrador. Los envíos temporales solo deben enviarse al almacén de borradores. Después de completar un determinado trabajo, los cambios del borrador se sincronizarán con finalización (solo sincronizar el contenido del archivo, no sincronizar registros de confirmación).

  1. prueba ambiental:

El programa que se debe utilizar es git, por lo que cuando el programa se está ejecutando es necesario detectar si se ha instalado git, dependiendo del comando también es necesario determinar si el borrador y la finalización son un almacén de git.

Implementación del código de función principal

prueba ambiental

  1. Declare tres variables para registrar los resultados de la detección del entorno.

    check1=0 # git的安装情况
    check2=0 # draft的情况
    check3=0 # finalization的情况
    
  2. Comprueba si git está instalado

    if [[ -x "$(command -v git)" ]] # 如果已安装git,command -v git会输出一个文件路径,-x判断输出的路径是否是一个可执行文件,如果是的话,那么git已安装。
    then
        echo "$(git version)"
    else
        echo -e "\033[35mmissing git!\033[0m"
        check1=1
    fi
    
  3. Compruebe si el espacio de trabajo cumple con los requisitos.
    Para ahorrar memoria y tener en cuenta la legibilidad, solo necesita usar una variable para almacenar la carpeta. El bit más bajo del binario check2 indica si el directorio existe y el segundo bit más bajo indica si es un almacén git, entonces el valor de check2 0 corresponde a lo normal, 1 corresponde a que este directorio no existe y 2 corresponde a que este directorio no es un almacén git.
    diagrama de flujo

    if [[ -d draft ]] # 先判断draft目录是否存在
    then
        echo "directory draft exit"
        cd draft
        if [[ $check1 = 1 ]]
        then
            echo -e "\033[35mdraft cannot be judged as a git repo because git is missing!\033[0m"
        elif [[ $(git rev-parse --is-inside-work-tree) ]]
        then
            echo "draft is a git repo."
        else
            echo -e "\033[35mdraft is not a git repo!\033[0m"
            check2=$[check2+2]
        fi
        cd ..
    else
        echo -e "\033[35mmissing directory draft!\033[0m"
        check2=$[check2+1]
    fi
    

    Igual que la finalización

Enviar borrador hasta su finalización

guardar borrador

cd draft 
git add * && git commit -a -m "auto commit by project manager" 
git push --all origin
cd ..

Enviar a finalización

cp -r ./draft/* ./finalization/

Espacio de trabajo de proceso

Además de la funcionalidad principal, también debe considerar la necesidad de realizar trabajos de migración, como simplemente iniciar un nuevo proyecto o continuar trabajando en otra máquina.

Inicializar espacio de trabajo

git init draft
git init finalization

Clonar espacio de trabajo

read -p "please input draft repo: " draft_repo_url draft
read -p "please input finalization repo: " finalization_repo_url finalization
git clone $draft_repo_url
git clone $finalization_repo_url

Extraer código del espacio de trabajo

cd draft
git fetch
git pull

cd ../finalization
git fetch
git pull
cd ..

código completo

Escriba las funciones principales anteriores utilizando declaraciones case-in, agregue medidas de entrada de prevención de errores y escriba el siguiente programa completo.

#!/bin/bash
check1=0
check2=0
check3=0

if [[ -x "$(command -v git)" ]]
then
    echo "$(git version)"
else
    echo -e "\033[35mmissing git!\033[0m"
    check1=1
fi

if [[ -d draft ]]
then
    echo "directory draft exit"
    cd draft
    if [[ $check1 = 1 ]]
    then
        echo -e "\033[35mdraft cannot be judged as a git repo because git is missing!\033[0m"
    elif [[ $(git rev-parse --is-inside-work-tree) ]]
    then
        echo "draft is a git repo."
    else
        echo -e "\033[35mdraft is not a git repo!\033[0m"
        check2=$[check2+2]
    fi
    cd ..
else
    echo -e "\033[35mmissing directory draft!\033[0m"
    check2=$[check2+1]
fi

if [[ -d finalization ]]
then
    echo "directory finalization exit"
    cd finalization
    if [[ $check1 == 1 ]]
    then
        echo -e "\033[35mfinalization cannot be judged as a git repo because git is missing!\033[0m"
    elif [[ $(git rev-parse --is-inside-work-tree) ]]
    then
        echo "finalization is a git repo."
    else
        echo -e "\033[35mfinalization is not a git repo!\033[0m"
        check3=$[check3+2]
    fi
    cd ..
else
    echo -e "\033[35mmissing directory finalization!\033[0m"
    check3=$[check3+1]
fi

if [[ "$1" == "test" ]]
then 
    if [[ $[check1+check2+check3] == 0 ]] 
    then 
        echo -e "\033[32mtest passed !!!\033[0m"
    else 
        echo -e "\033[31mtest failed !!!\033[0m"
    fi
    exit 0
elif [[ $check1 == 1 ]]
then 
    echo -e "\033[31m[error 1]: missing git.\033[0m"
    exit 1
fi


case $1 in
init|\-i)
    git init draft
    git init finalization
;;
clone)
    read -p "please input draft repo: " draft_repo_url draft
    read -p "please input finalization repo: " finalization_repo_url finalization
    git clone $draft_repo_url
    git clone $finalization_repo_url
;;
config)
    case $2 in
    draft)
        cd draft
        git remote add origin $3
        cd ..
    ;;
    finalization)
        cd finalization
        git remote add origin $3
        cd ..
    ;;
    esac
;;
pull|\-p)
    if [[ [$check2%2] == 1 ]]
    then 
        echo -e "\033[31mderetory draft doesn't exist!\033[0m"
    elif [[ $check2 -ge 2 ]]
    then
        echo -e "\033[31mdraft is not a git repo!\033[0m"
    else
        cd draft
        git fetch
        git pull
    fi
    if [[ [$check3%2] == 1 ]]
    then 
        echo -e "\033[31mderetory finalization doesn't exist!\033[0m"
    elif [[ $check3 -ge 2 ]]
    then
        echo -e "\033[31mfinalization is not a git repo!\033[0m"
    else
        cd ../finalization
        git fetch
        git pull
        cd ..
    fi
;;
draft|\-d) # to finish if and fi
    if [[ [$check2%2] == 1 ]]
    then 
        echo -e "\033[31mderetory draft doesn't exist!\033[0m"
    elif  [[ $check2 -ge 2 ]]
    then
        echo -e "\033[31mdraft is not a git repo!\033[0m"
    else
        echo "project manager is saving draft!"
        cd draft 
        git add * && git commit -a -m "auto commit by project manager" 
        git push --all origin
        cd ..
    fi
    ;;
finalization|\-f)
    if [[ [$check3%2] == 1 ]]
    then 
        echo -e "\033[31mderetory finalization doesn't exist!\033[0m"
    else
        echo "project manager is saving publish"
        cp -r ./draft/* ./finalization/
    fi
    ;;
"")
    echo -e "\033[31mmissing operation\033[0m"
    ;;
*)
    echo "invalid operation!"
    exit 1
    ;;
esac

dirección del proyecto

Supongo que te gusta

Origin blog.csdn.net/u013943146/article/details/118769217
Recomendado
Clasificación