[리눅스/윈도] git fetch, pull 응용 스크립트

2023. 5. 6. 18:35버전관리 및 빌드/Git

작성일 : 2021. 9. 15.

 

프로젝트 디렉토리 구조가 다음과 같을 때

각각의 디렉토리로 들어가서 git fetch && git pull 을 실행하는 스크립트다.

로컬 브랜치마다 업데이트를 하고 보여줘야 하기 때문에 git branch 명령도 활용한다.

 

최상위 디렉토리 (Workspace) 하위 프로젝트 디렉토리 비고
/mnt/d/backend    
  /repoPrj0 .git 존재
  /repoPrj1 .git 존재
  /repoPrj2 .git 존재

 

굳이 IDE 에서 마우스로 연속된 클릭 동작으로 안하고 힘들게 하냐고 묻는 사람이 있다.

하지만, 한 번에 처리하는 게 편하거든. VsCode 띄워놓고 [새로 고침], [Pull], ... 언제 다 누르냐고, 그것도 성가시게 프로젝트마다 눌러가면서 말이지.

 

사용법)

상위 디렉토리에서 전체 프로젝트에 대한 최신 커밋을 받아올 때:
[/mnt/d/backend]$ git_pull.sh
************** repoPrj0
* dev -> 이미 업데이트 되어 있습니다.
************** repoPrj1
  dev -> 이미 업데이트 되어 있습니다.
* newDev -> example.vue !@#$%^... Updating
  oldWork -> example.vue !@#$%^... Updating
************** repoPrj2
* dev -> 이미 업데이트 되어 있습니다.
~~~~~~~~~~~~~~~~~~~~~~~~~~~
프로젝트 1건에 대해서 실행할 때:
[/mnt/d/backend/repoPrj2]$ git_pull.sh
************** repoPrj2
* dev -> 이미 업데이트 되어 있습니다.

 

스크립트 소스)

#!/bin/bash
# Copyright [2021] [한정훈 & blog.daum.net/debianizer & 종이와 쉼터]
# 
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# 
#    http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ------------------------------------------------------------
# 본 BASH 스크립트는 아파치 라이선스 버전 2.0(라이선스)에 따라 라이선스가 부여됩니다.
# 라이선스를 준수하지 않는 한 이 파일을 사용할 수 없습니다.
# 다음에서 라이선스 사본을 얻을 수 있습니다.
# 
#  http://www.apache.org/licenses/LICENSE-2.0
# 
# 관련 법률에서 요구하거나 서면으로 동의하지 않는 한 소프트웨어
# 라이선스에 따라 배포되는 것은 "있는 그대로" 배포되며,
# 명시적이든 묵시적이든 어떠한 종류의 보증이나 조건도 제공하지 않습니다.
# 라이선스에 따른 권한 및 제한 사항을 관리하는 특정 언어는 라이선스를 참조하십시오. 
# 
# 퍼갈 때는 출처를 남겨주십시오.
PREV=''
BRAN=''
prev() {
	# cd 명령으로 프로젝트 디렉토리마다 들어가기 때문에 pull 동작을 마친 후에는
    # 처음 시행한 위치를 알고 있어야 한다.
	PREV=$(git branch | grep '^*' | sed 's/* //')
}
branch() {
	# 로컬 브랜치를 모두 가져와서 배열에 담는다.
    # 활성화된 브랜치 앞에는 '* ' 가 붙기 때문에 sed 명령으로 끄트머리를 삭제한다. 
	BRAN=$(git branch | sed 's/* //')
}
work() {
	prev
	branch
	for i in ${BRAN[@]};do
		git checkout $i --quiet; # '--quiet' 인자를 붙여서 자잘한 메시지 출력을 막는다.
		git fetch --quiet;
		if [ $i == $PREV ];then
        	# 기존 작업 중이던 브랜치 앞에 '* ' 를 붙인다.
			git pull | xargs echo '* '$i' -> ' -;
		else
			git pull | xargs echo $i' -> ' -;
		fi
	done
	git checkout $PREV --quiet
}
reset_exit() {
	unset PREV
	unset BRAN
	exit 0
}
# 본 스크립트를 실행한 위치에 .git 이 들어 있으면 해당 경로에 대해서만 작업한다.
if [ -d ".git" ];then
	work
	reset_exit
else
	# '.git' 밖에서 실행하는 경우, 각각의 프로젝트 디렉토리마다 들어가서 일괄작업을 한다.
	PRJ_DIR=$(find . -maxdepth 1 -type d -name 'repoPrj*' | sed 's/.\///g')
	for i in ${PRJ_DIR[@]};do
		cd $i
		echo -e '********************** '$i
		work
		cd ..
		echo -e '\n'
	done
	reset_exit
fi