2>/dev/null 부분

2>/dev/null 부분

방금 다음 스크립트를 작성했습니다. 현재 분기를 해당 원격 분기로 푸시합니다.

#!/usr/bin/env bash

# Usage: pushes current checkout branch to its remote counterpart.

current_branch=$(git symbolic-ref HEAD 2>/dev/null) ||
current_branch="(unnamed branch)"

git push origin ${current_branch}

git symbolic-ref ...내가 하고 싶은 일을 어떻게 이룰 수 있을지 구글링을 하다가 결국 이런 일을 하게 되었습니다. 내가 원하는 대로 작동하는 것 같은데, 이를 달성할 수 있는 다른 방법이 있나요?

이 부분의 의미/기능도 모르겠습니다.2>/dev/null

편집하다:조금 읽어본 후배쉬 문서이것이 리디렉션의 왕인 것 같아요?

답변1

자, 코드 리뷰가 시작됩니다.

# Usage: pushes current checkout branch to its remote counterpart.

첫 번째 단어를 건너뜁니다. 이는 스크립트를 사용하는 방법이 아니라 스크립트의 기능을 설명하는 주석입니다.

current_branch=$(git symbolic-ref HEAD 2>/dev/null) ||
current_branch="(unnamed branch)"

을(를 ) 실행 git symbolic-ref HEAD하고 삭제 하고 변수에 stderr할당하고 있습니다 . stdout실패하면 지점 이름을 사용할 수 있습니다 (unnamed branch).

git push origin ${current_branch}

마지막으로 로컬 분기를 원본으로 푸시합니다.


다음은 몇 가지 설명입니다.

2>/dev/null 부분

stdinLinux/Unix 터미널에서 실행되는 모든 프로그램에는 일반적으로 키보드에서 입력을 수집하는 입력 채널이라는 입력 채널이 있습니다 . 또한 stdout(정상 작동 정보 인쇄를 위한 표준 출력) 및 stderr(경고 및 런타임 오류 인쇄를 위한 표준 오류) 라는 두 개의 출력 채널이 있습니다 . 이러한 채널은 하드웨어에서 시작되었지만 이제는 모든 터미널과 모든 셸에서 지원되는 소프트웨어 전용 표준입니다. Bash가 stdout 및 stderr 채널을 처리하는 방식은 1숫자와 2. 이 2>부분이 하는 일은 프로그램에게 표준 오류를 다른 대상으로 리디렉션하도록 지시하는 것뿐입니다. /dev/null기본적으로 블랙홀 역할을 하는 가상 장치입니다. 거기로 보낸 모든 것은 손실될 것입니다. 따라서 2>/dev/null문자 그대로의 의미는 "비표준 출력을 인쇄하지 마십시오"입니다.

||부분

Bash의 이중 파이프는 왼쪽 프로그램이 실패하는 경우, 즉 왼쪽 프로그램이 아닌 다른 종료 코드를 반환하는 경우 0이중 파이프의 오른쪽을 실행한다는 의미입니다. "오른쪽"은 동일한 변수에 대체 값을 할당하는 다음 줄로 계속됩니다.


이제 댓글로 돌아갑니다.

새로 생성된 분기를 원본 원격 분기로 푸시하고 로컬 분기와 동일한 이름을 갖기를 원합니다.

귀하의 코드는 이 작업을 수행하지 않습니다. 글쎄요, 믿을 수 없어요.

HEADgit에서 현재 체크아웃된 브랜치의 최신 커밋(있는 경우)을 가리키는 특수 참조입니다. 마지막 부분은 코드가 위험에 노출되는 부분입니다. HEAD항상 지점을 가리킬 필요는 없습니다. 소위 분리된 HEAD 상태일 수도 있습니다. 이 경우 오류로 인해 명령이 실패합니다 fatal: ref HEAD is not a symbolic ref. 이 오류는 스크립트에 의해 삭제되며 분기 이름은 계속 사용됩니다 (unnamed branch). 마지막 줄은 (unnamed branch)아마도 원하지 않는 로컬 지점을 푸시하려고 시도할 것입니다.

명령이 성공하더라도 비슷한 출력이 표시됩니다 refs/heads/yourbranchname. 이 옵션을 사용하여 --short마지막 부분만 가져올 수 있습니다.

git symbolic-ref --short HEAD

결과는 다음과 같습니다:

yourbranchname

지점이 없으면 어떻게 되나요? 단순한. 당신은 아무것도 밀고 싶지 않습니다! 분기 이름을 확인할 수 없는 경우 스크립트를 종료해야 합니다. 방법은 다음과 같습니다. 명시적으로 exit $errorcode또는 bash를 사용하여 플래그를 추가합니다 set -e.

current_branch=$(git symbolic-ref HEAD) || exit $?

여기에는 $?마지막 명령의 종료 코드가 포함되어 있으므로 git호출이 실패했습니다. 숨길 필요는 없습니다 stderr. 이렇게 하면 무엇이 잘못되었는지 파악하는 데 도움이 됩니다.

또는:

set -e
current_branch=$(git symbolic-ref HEAD)

set -e오류가 발생할 때마다 스크립트를 종료하는 특수 bash 모드를 활성화합니다 . 모든 스크립트에서 이것을 사용하는 것이 좋습니다.

다음 부분:

git push origin ${current_branch}

이 순서에는 아무런 문제가 없습니다. 하지만 내 생각엔 당신이 당신의 삶을 좀 너무 힘들게 만들고 있는 것 같아요. 이 세부 명령은 로컬 지점과 원격 지점 간의 링크를 생성하는 데 한 번만 필요합니다. -u다음 옵션을 사용하여 링크를 저장할 수 있습니다 .

git push -u origin ${current_branch}

이 명령을 한 번 실행한 후 입력하기만 하면 git push자동으로 올바른 원격 분기로 푸시됩니다. 이 링크는 원격 지점을 체크아웃하거나 복제할 때 자동으로 설정된다는 점을 기억하세요. 이는 로컬로 생성된 분기에만 필요합니다.

요약해보자

다음과 같이 스크립트를 다시 작성하고 싶을 수도 있습니다.

#!/usr/bin/env bash

# Pushes current checkout branch to its remote counterpart.

set -e

current_branch=$(git symbolic-ref --short HEAD)
git push -u origin "${current_branch}"

새 분기에 대해 한 번 실행한 후 다음을 사용하세요.

git push

답변2

push.default내부 설정을 살펴보세요 git help config.

나는 그 일부를 인용한다:

   push.default
       Defines the action git push should take if no refspec is
       explicitly given. Different values are well-suited for specific
       workflows; for instance, in a purely central workflow (i.e. the
       fetch source is equal to the push destination), upstream is
       probably what you want. Possible values are:

       ...

       o   current - push the current branch to update a branch with
           the same name on the receiving end. Works in both central
           and non-central workflows.

한마디로 달려라git config --global push.default current 한 번귀하의 컴퓨터에서 git push지금부터 사용을 시작하십시오.


이야기의 교훈은 제가 시나리오를 쓰는 두 가지 기본 규칙 중 하나입니다.

새 바퀴를 발명하기 전에 항상 문서를 확인하십시오. (널리 사용되는 도구의 경우) 종종 "shim" 스크립트를 직접 작성하지 않고도 필요한 작업을 정확하게 수행하는 옵션이 이미 있습니다.

(이 규칙에 대한 일반적인 위반은 동일한 작업을 수행하는 특정 명령줄 플래그를 무시하는 도구에 대한 길고 복잡한 "래퍼" 스크립트를 작성하는 것입니다. 이는 매우 일반적이며 보기에 골치 아픈 일입니다. .)

관련 정보