gitconfig 및 쉘 스크립트에서 기본 브랜치를 작동하는 방법

gitconfig 및 쉘 스크립트에서 기본 브랜치를 작동하는 방법

master많은 프로젝트(예: GitHub)에서 git의 기본 분기 이름이 크게 변경되면 main이를 기본값으로 가정한 일부 스크립트와 구성이 손상됩니다. 예를 들어, 일부 git 명령을 입력하는 시간을 절약하기 위해 별칭을 설정하는 경우:

[alias]
    com = checkout master
    rbm = rebase master
    rbmi = rebase -i master

쉘 스크립트에도 동일하게 적용됩니다. 이에 상응하는 것이 있지만 git checkout master현재 저장소가 무엇이든 master가 기본 분기인 곳이 있습니까?

답변1

Git에는 기본 분기에 대한 개념이 없습니다. 저장소에는 여러 개의 독립적인 개발 라인(예: 유지 관리 및 개발 분기)이 포함될 수 있으며, 그중 어느 것도 다른 것보다 더 특별하지 않습니다. 브랜치의 중요성과 병합 방법은 저장소 소유자에 따라 다릅니다.

GitHub 및 다른 곳의 기본 분기는 HEAD기본 저장소를 가리키는 분기라고 생각합니다. 다음 명령을 실행하면 마지막으로 업데이트되었을 때 리모컨의 이름이 무엇인지 확인할 수 있습니다.

$ git rev-parse --abbrev-ref origin/HEAD
origin/master

원격 장치의 최신 값을 알고 싶고 이를 위해 네트워크 요청을 하려는 경우 다음을 수행할 수 있습니다.

$ git ls-remote --symref origin | head -n1
ref: refs/heads/master  HEAD

git remote set-head -a origin이 참조는 자동으로 업데이트되지 않습니다. 업데이트하려면 실행해야 합니다 .

그러나 기본 분기로 사용되는 로컬 분기의 이름은 알려주지 않습니다. 예를 들어, 위 명령은 내 Git 복사본에서 가져온 것입니다 master. 여기서 기본 분기는 입니다. 그러나 내 로컬 컴퓨터에서는 원격 저장소의 기본 분기를 끌어온 분기 dev(내가 선호하는 기본 분기 이름)라고 합니다. 이것이 당신이 알고 싶은 것이라면 아마도 당신이 원하는 명령일 것입니다( origin리모컨이라고 가정).

$ git config -l | ruby -e '
remote = ARGV[0]
head = `git rev-parse --abbrev-ref #{remote}/HEAD`.chomp
a = {}
while line = $stdin.gets
  if line =~ /^branch\.(.*)\.remote=(.*)$/
    a[$1] ||= [nil, nil]
    a[$1][0] = $2
  elsif line =~ %r[^branch\.(.*)\.merge=refs/heads/(.*)$]
    a[$1] ||= [nil, nil]
    a[$1][1] = $2
  end
end
puts a.map { |k, (a, b)| ["#{a}/#{b}", k]}.to_h[head]' origin

Ruby이므로 한 줄로 만들고 싶다면 개행 문자를 세미콜론으로 바꾸면 됩니다. Perl을 선호한다면 Perl을 사용할 수도 있습니다.

답변2

기본 분기를 가져오는 전용 명령은 없습니다. 그러나 몇 가지 해결 방법을 사용하면 얻을 수 있습니다. 자체 저장소를 사용하는 경우 언제든지 동일한 이름을 선택할 수 있습니다. 다른 사람을 사용하고 있다면 그 사람도 일종의 리모콘을 갖게 될 것입니다.데이비드 월시) 도움이 되는:

LC_ALL=C git remote show origin | sed -n '/HEAD branch:/{s/.*: //;p}'

관련 정보