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.
- 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).
- 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
-
Declare tres variables para registrar los resultados de la detección del entorno.
check1=0 # git的安装情况 check2=0 # draft的情况 check3=0 # finalization的情况
-
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
-
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.
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