1. 문제점

  • git pull → 원격 Head 와 로컬 Head가 일치하지 않는 이슈 ⇒ 정확히는 로컬 Head는 최신 Commit으로 position하는데 원격 Head는 이동하지 않음
sudo git pull <http://oauth2:<OAUTH_TOKEN>@<IP>:<PORT>/some/something.git>
sudo git add .
sudo git commit -m "update yaml"
sudo git push <http://oauth2:<OAUTH_TOKEN>@<IP>:<PORT>/some/something.git>
# git status나 git log를 쳐보면 remote git repo랑 동기화가 안되있음(local head가 remote head보다 앞서있음),
  • 기존 git pull에서 문제가 없었던 이유는 기존 git pull은 아래와 같이 사용
git pull origin master
Username: 
Password:
  • 현재에는 아래와 같이 토큰( private access token, oauth token ) 을 이용하여 pull함
git pull <http://ouath:<OAUTH_TOKEN>@<IP>:<PORT>/some/something.git>

origin은 특정 URL로 원격 repo와 매핑되어 있다. 즉, git pull from origin을 통해서는 그 origin을 찾을 수 있고 이로 인해 원격 Head가 업데이트된다.

하지만 다른 URL로 pull을 받는 경우 origin을 찾지 못해 원격 HEAD가 업데이트되지 않는다.

2. 해결법

  • 로컬에서 origin을 업데이트해야 하기 때문에 fetch를 진행한다
git fetch origin
  • 여기서 git fetch origin을 뜯어보면
fetch = +refs/heads/*:refs/remotes/origin/*

이다. 여기서 위 +refs/heads/*:refs/remotes/origin/*을 Git Refspec 이라고 한다.

2.1 Git Refspec

Refspec의 각 부분을 떼서 설명하면

  1. The + means to apply the rule without failure even if doing so would move a target ref in a non-fast-forward manner. I'll come back to that.
  2. The part before the : (but after the + if there is one) is the "source" pattern. That's refs/heads/*, meaning this rule applies to any remote reference under refs/heads (meaning, branches).
  3. The part after the : is the "destination" pattern. That's refs/remotes/origin/*.

간단히 설명하면 + 는 fast-forward가 아닌 업데이트를 허용한다는 의미,

: 전후로 <src>:<dest> 로 나뉜다.

<src>는 soruce패턴, 원본을 의미한다, 원격 저장소의 Refs 경로이다.

<dest>는 destination패턴, 즉 합쳐야 할 대상을 의미한다. 로컬 저장소의 Refs 경로이다.

😭 하지만 git fetch origin 또한 아이디와 비밀번호를 요구하기 때문에 토큰을 이용하여 진행해야 한다

git fetch <http://oauth:<OAUTH_TOKEN>@<IP>:<PORT>/some/something.git> refs/heads/main:refs/remotes/origin/main

참고

Git - git-fetch Documentation

git fetch https:// url-to-repo :git-branch not working

[Git] Refspec

Git - What is "Refspec"