developer tip

첫 번째 명령 이후에 종료하지 않고 배치 파일에서 여러 git 명령을 실행하려면 어떻게해야합니까?

optionbox 2020. 12. 31. 08:13
반응형

첫 번째 명령 이후에 종료하지 않고 배치 파일에서 여러 git 명령을 실행하려면 어떻게해야합니까?


계속해서 사용하는 일련의 GIT 명령을 배치 파일로 사용하여 너무 많이 반복하지 않도록 노력했습니다. 예를 들어, update_repo_branch.bat로컬 리포지토리를 업데이트하고 분기를 원격 분기와 동기화하기 위해이 배치 파일을 호출 했습니다.

@echo off
if (% 1) == () goto end
if (% 2) == () goto end
cd % 1
git checkout % 2
git fetch origin
git merge oring / % 2
: end

게 으르는 것이 좋지만 GIT 명령이 완료되면 실행중인 모든 항목을 종료하기 위해 종료 플래그를 다시 보내는 것 같습니다 . 따라서 배치 파일을 사용하여 한 번에 모두 추출하는 것은 작동하지 않습니다. 이 문제를 해결하는 방법을 아십니까?


이것이 모든 Windows git 패키지에 해당하는지 확실하지 않지만 적어도 일부 git.cmd는 실제 git 실행 파일 (예 :)을 감싸는 래퍼로 스크립트를 사용합니다 git.exe. 따라서 배치 파일에서 git명령을 사용할 때 Windows는 실제로 다른 배치 파일을 실행합니다.

안타깝게도 한 배치 파일이 다른 배치 파일을 호출하면 기본적으로 호출 된 배치 파일로 '점프'되어 반환되지 않습니다 (이는 고대 MS-DOS 명령 프로세서와의 호환성을위한 것입니다).

이 문제는 몇 가지 방법으로 해결할 수 있습니다.

  1. 명령을 git사용하여 배치 파일에서 호출 하여 배치 파일 call을 실행하고 git.cmd다시 자신의 파일로 돌아갑니다.

    call git checkout %2
    call git fetch origin
    rem etc...
    
  2. 배치 파일을 완전히 피하려면 확장명을 git사용하여 배치 파일에서 .exe명시 적으로 호출 하십시오 git.cmd. 이것이 작동하려면 경로 및 기타 환경 변수가 git.exe예상 대로 설정되어 있는지 확인해야 할 수 있습니다 ( git.cmdmsysgit에서 수행 되는 것처럼 보입니다 ).

    git.exe checkout %2
    rem etc...
    

귀하의 예에서 볼 수 있듯이 실제로 로컬 브랜치 'branchname'을 origin / branchname과 동기화하려고합니다.

이를 위해 추가 스크립팅이 필요하지 않으며 git pull시퀀스 대신 사용하면 됩니다.git checkout branchname; git fetch origin; git merge origin/branchname

git의 브랜치 추적과 그 이점에 대한 문서를 살펴보십시오.

일반적으로 다음과 같은 저장소 레이아웃이있는 경우 :

git branch -a
...
master
dev1
dev2
remotes/origin/master
remotes/origin/dev1
remotes/origin/dev2

그리고 dev1 및 dev2 브랜치는 origin / dev1 및 origin / dev2에 대한 브랜치를 이에 따라 추적하므로 저장소에서 실행하기 만하면됩니다.

git pull

이 명령은 모든 로컬 추적 분기를 원격 분기와 효과적으로 동기화합니다.

자세한 내용은 여기를 참조하십시오.

힘내 풀 문서

Git 원격 분기 및 추적 분기 (Progit Book)


msysGit을 Git 클라이언트로 사용한다고 가정하면 실제로 Bash 스크립트를 사용하고 싶을 수 있습니다. 다음과 같이 bash 함수를 ~/.bashrc(~는 일반적으로 C : \ Users \- 여기 참조 ) 배치 할 수 있습니다.

update_repo_branch() {
    if [ $# != "2" ]; then
        echo "Usage: update_repo_branch REPO BRANCH" 1>&2
        return 1
    fi

    cd $1
    git checkout $2
    git fetch origin
    git merge origin/$2
}

그런 다음 update_repo_branch myrepo cool-branchmysysGit 셸에서 실행할 수 있습니다 .

물론 cmd.exe에서는 액세스 할 수 없습니다. msysGit cygwin 셸에서만 사용할 수 있습니다.

ReferenceURL : https://stackoverflow.com/questions/5401229/how-do-i-execute-several-git-commands-in-a-batch-file-without-terminating-after

반응형