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의 각 부분을 떼서 설명하면
- 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.
- 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).
- 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