Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

GitHub 및 GitLab 리포지토리 복제 및 관리를 위한 Bash 단일 라이너 작성 방법

지루한 작업을 자동화하는 우아한 Bash 라인보다 더 만족스러운 것은 없습니다.

Bash 스크립트를 사용하여 랩톱을 자동으로 다시 만드는 방법에 대한 최근 연구의 일환으로(포스팅 예정!) GitHub에서 호스팅하는 리포지토리를 새 시스템에 쉽게 복제할 수 있는 방법을 찾고 싶었습니다. 약간의 파기 후에, 나는 바로 그것을 한 한 줄짜리를 작성했습니다.

그런 다음 모든 계란을 같은 바구니에 담지 않는다는 정신으로 GitLab에서 호스팅하는 백업을 자동으로 만들고 푸시하는 또 다른 단일 라이너를 작성했습니다. 여기 있습니다.

모든 GitHub 저장소를 복제하는 Bash 단일 라이너

주의 사항:복제하려는 GitHub 저장소 목록이 필요합니다. 이것의 좋은 점은 전체 선택 대신 컴퓨터에서 원하는 리포지토리만 선택할 수 있는 완전한 선택의지를 제공한다는 것입니다.

15분 캐시된 자격 증명과 함께 HTTPS를 사용하거나 SSH로 GitHub에 연결하여 내가 선호하는 방법을 사용하여 매번 암호를 입력하지 않고도 GitHub 리포지토리를 쉽게 복제할 수 있습니다. 간결함을 위해 후자를 사용한다고 가정하고 SSH 키가 설정되었습니다.

gh-repos.txt 파일의 GitHub URL 목록 제공 , 다음과 같이:

git@github.com:username/first-repository.git
git@github.com:username/second-repository.git
git@github.com:username/third-repository.git

우리는 실행합니다:

xargs -n1 git clone < gh-repos.txt

이렇게 하면 목록의 모든 리포지토리가 현재 폴더에 복제됩니다. 적절한 URL로 대체하면 동일한 한 줄짜리가 GitLab에서도 작동합니다.

무슨 일입니까?

이 한 줄짜리에는 두 개의 반쪽이 있습니다. 직관적으로 오른쪽에 입력이 있고 왼쪽에 작업을 수행하는 부분이 있습니다. 다음과 같은 동일한 명령을 작성하여 이러한 부분의 순서를 보다 직관적으로 만들 수 있습니다(아마도?).

<gh-repos.txt xargs -n1 git clone 

입력의 각 줄에 대해 명령을 실행하려면 gh-repos.txt , 우리는 xargs -n1을 사용합니다. . 도구 xargs 입력에서 항목을 읽고 찾은 모든 명령을 실행합니다(echo 찾지 못한 경우). 기본적으로 항목은 공백으로 구분되어 있다고 가정합니다. 새 줄도 작동하고 목록을 더 쉽게 읽을 수 있습니다. 플래그 -n1 xargs에 알려줍니다. 1 사용 인수 또는 우리의 경우 명령당 한 줄입니다. git clone으로 명령을 빌드합니다. , xargs 그런 다음 각 줄에 대해 실행됩니다. 따다.

GitLab에서 많은 리포지토리를 만들고 푸시하기 위한 Bash 원 라이너

GitHub와 달리 GitLab을 사용하면 먼저 새 저장소를 만들기 위해 웹사이트를 사용할 필요가 없는 멋진 일을 할 수 있습니다. 터미널에서 새 GitLab 저장소를 만들 수 있습니다. 새로 생성된 저장소는 기본적으로 비공개로 설정되어 있으므로 GitLab에서 공개로 설정하려면 나중에 수동으로 설정해야 합니다.

GitLab 문서에서는 git push --set-upstream을 사용하여 새 프로젝트를 생성하도록 push하라고 알려줍니다. , 하지만 GitLab을 백업으로 사용하는 데에는 이것이 그다지 편리하지 않습니다. 앞으로 내 리포지토리로 작업할 때 GitHub 모두에 푸시하는 하나의 명령을 실행하고 싶습니다. 추가 노력 없이 GitLab을 사용할 수 있습니다.

이 Bash를 한 줄로 작동하게 하려면 GitLab의 저장소 URL 목록(아직 존재하지 않는 URL)도 필요합니다. GitHub 리포지토리 목록을 복사하고 Vim으로 열고 검색 및 바꾸기를 수행하면 이 작업을 쉽게 수행할 수 있습니다.

cp gh-repos.txt gl-repos.txt
vim gl-repos.txt
:%s/\<github\>/gitlab/g
:wq

이것은 gl-repos.txt를 생성합니다. , 다음과 같습니다:

git@gitlab.com:username/first-repository.git
git@gitlab.com:username/second-repository.git
git@gitlab.com:username/third-repository.git

GitLab에서 이러한 리포지토리를 만들고 URL을 원격으로 추가하고 다음을 실행하여 코드를 새 리포지토리에 푸시할 수 있습니다.

awk -F'\/|(\.git)' '{system("cd ~/FULL/PATH/" $2 " && git remote set-url origin --add " $0 " && git push")}' gl-repos.txt

잠시만 기다려 주십시오. 제가 설명하겠습니다. 지금은 ~/FULL/PATH/ GitHub 리포지토리가 포함된 디렉터리의 전체 경로여야 합니다.

다음과 같은 몇 가지 가정에 유의해야 합니다.

  1. 리포지토리를 포함하는 로컬 시스템의 디렉토리 이름은 URL의 리포지토리 이름과 동일합니다(위의 한 줄로 복제된 경우에 해당).
  2. 각 저장소는 현재 푸시하려는 분기로 체크아웃되어 있습니다. master .

이러한 가정을 처리하기 위해 한 줄짜리를 확장할 수 있지만, 그 시점에서 우리는 Bash 스크립트를 작성해야 한다는 것은 저자의 겸손한 의견입니다.

무슨 일입니까?

Bash 한 줄짜리는 gl-repos.txt의 각 줄(또는 URL)을 사용합니다. 파일을 입력으로. awk 사용 , 로컬 시스템의 저장소가 포함된 디렉토리 이름을 분리하고 이러한 정보를 사용하여 더 큰 명령을 빌드합니다. print한다면 awk의 출력 , 우리는 다음을 보게 될 것입니다:

cd ~/FULL/PATH/first-repository && git remote set-url origin --add git@gitlab.com:username/first-repository.git && git push
cd ~/FULL/PATH/second-repository && git remote set-url origin --add git@gitlab.com:username/second-repository.git && git push
cd ~/FULL/PATH/third-repository && git remote set-url origin --add git@gitlab.com:username/third-repository.git && git push

이 명령을 빌드하는 방법을 살펴보겠습니다.

awk로 문자열 분할

도구 awk 필드 구분 기호에 따라 입력을 분할할 수 있습니다. 기본 구분 기호는 공백 문자이지만 -F를 전달하여 변경할 수 있습니다. 깃발. 단일 문자 외에도 정규식 필드 구분 기호를 사용할 수도 있습니다. 저장소 URL에는 설정된 형식이 있으므로 슬래시 문자 / 사이의 하위 문자열을 요청하여 저장소 이름을 가져올 수 있습니다. URL의 끝, .git .

이를 수행하는 한 가지 방법은 정규식 \/|(\.git)을 사용하는 것입니다. :

  • \/ 이스케이프된 /입니다. 캐릭터;
  • | "또는"을 의미하며, awk에게 두 표현식 중 하나와 일치하도록 지시합니다.
  • (\.git) 이스케이프된 .가 있는 ".git"과 일치하는 URL 끝에 있는 캡처 그룹입니다. 캐릭터. ".git"이 어떤 것도 엄격하게 분할하지 않기 때문에 이것은 약간의 속임수이지만(다른 쪽에는 아무 것도 없음) 이 부분을 쉽게 제거할 수 있습니다.

일단 awk 분할할 위치에서 필드 연산자를 사용하여 올바른 부분 문자열을 가져올 수 있습니다. $로 필드를 참조합니다. 문자, 필드의 열 번호 순입니다. 이 예에서는 두 번째 필드인 $2를 원합니다. . 모든 하위 문자열은 다음과 같습니다.

1: git@gitlab.com:username
2: first-repository

전체 문자열을 사용하거나 이 경우 전체 URL을 사용하려면 필드 연산자 $0를 사용합니다. . 명령을 작성하기 위해 저장소 이름과 URL을 필드 연산자로 대체하면 됩니다. print로 실행 건물을 짓는 동안 모든 공간이 올바른지 확인하는 데 도움이 될 수 있습니다.

awk -F'\/|(\.git)' '{print "cd ~/FULL/PATH/" $2 " && git remote set-url origin --add " $0 " && git push"}' gl-repos.txt

명령 실행

system() 괄호 안에 명령을 작성합니다. . 이것을 awk의 출력으로 사용하여 , 각 명령은 빌드되고 출력되는 즉시 실행됩니다. system() 함수는 우리의 명령을 실행하는 자식 프로세스를 만든 다음 명령이 완료되면 반환합니다. 일반 영어로 이를 통해 awk 은(는) 입력 파일로 작업을 수행하고 있습니다. 다시 한 번 우리의 마지막 명령이 있습니다. 모두 합해졌습니다.

awk -F'\/|(\.git)' '{system("cd ~/FULL/PATH/" $2 " && git remote set-url origin --add " $0 " && git push")}' gl-repos.txt

백업 사용

GitLab URL을 원격으로 추가하여 외부 호스팅 리포지토리로 푸시하는 프로세스를 단순화했습니다. git remote -v를 실행하면 저장소 디렉토리 중 하나에 다음이 표시됩니다.

origin  git@github.com:username/first-repository.git (fetch)
origin  git@github.com:username/first-repository.git (push)
origin  git@gitlab.com:username/first-repository.git (push)

이제 git push를 실행하기만 하면 됩니다. 인수가 없으면 현재 분기를 두 원격 저장소로 푸시합니다.

또한 git pull 일반적으로 원래 복제한 원격 저장소((fetch)로 표시된 URL)에서만 가져오려고 시도합니다. 위의 예에서). 여러 Git 리포지토리에서 동시에 가져오는 것은 가능하지만 복잡하고 이 게시물의 범위를 벗어납니다. 다음은 호기심이 있는 경우 시작하는 데 도움이 되도록 여러 리모컨을 밀고 당기는 방법에 대한 설명입니다. 리모컨에 대한 Git 문서도 도움이 될 수 있습니다.

Bash 단일 라이너의 간결함을 설명하기 위해

Bash 원 라이너는 이해하면 재미있고 편리한 단축키가 될 수 있습니다. 최소한 xargs와 같은 도구를 알고 있어야 합니다. 및 awk 우리 작업의 많은 지루함을 자동화하고 완화하는 데 도움이 될 수 있습니다. 그러나 몇 가지 단점이 있습니다.

이해하기 쉽고 유지 관리하기 쉽고 접근하기 쉬운 도구 측면에서 Bash 단일 라이너는 형편없습니다. 일반적으로 if를 사용하는 Bash 스크립트보다 작성하기가 더 복잡합니다. 또는 while 루프이며 확실히 읽기가 더 복잡합니다. 우리가 그것들을 작성할 때 작은 따옴표나 닫는 괄호를 어딘가에서 놓칠 가능성이 있습니다. 그리고 이 포스트가 보여주기를 바라는 것처럼, 그들도 꽤 많은 설명을 할 수 있습니다. 그렇다면 왜 사용합니까?

케이크 굽기 레시피를 단계별로 읽는다고 상상해 보세요. 방법과 재료를 이해하고 재료를 모으십시오. 그러다가 곰곰이 생각해보면 모든 재료를 정확한 순서로 오븐에 넣기만 하면 바로 케이크가 완성된다는 사실을 깨닫기 시작합니다. 당신이 그것을 시도하고 작동합니다!

꽤 만족스럽겠죠?