prosource

베어가 아닌 Git 저장소로 푸시하는 방법은 무엇입니까?

probook 2023. 8. 11. 22:25
반응형

베어가 아닌 Git 저장소로 푸시하는 방법은 무엇입니까?

저는 주로 Git 저장소가 있는 ssh(화면 및 vim)를 통해 원격 서버에서 작업합니다.온라인 상태가 아닌 경우가 있으므로 랩톱에 별도의 리포지토리(리모트에서 복제)가 있습니다.

그러나 일반적으로 방화벽 뒤에 있거나 공용 IP가 없기 때문에 원격지의 이 저장소에서 풀을 풀 수 없습니다.

저는 제가 맨 저장소로 밀어 넣어야 한다고 읽었습니다.그런 다음 변경 사항을 원격 저장소에 어떻게 푸시해야 합니까?

최상의 옵션

비어 있는 원격 저장소에 푸시하는 가장 깨끗하고, 가장 덜 혼란스러우며, 안전한 방법은 랩톱 분기를 나타내는 원격의 전용 분기로 푸시하는 것입니다.

가장 간단한 경우를 살펴보고 각 repo에 하나의 분기(마스터)만 있다고 가정하겠습니다.노트북에서 원격 repo로 푸시할 때 master -> master를 푸시하는 대신 master -> laptop-master(또는 유사한 이름)를 푸시합니다.이렇게 하면 푸시는 원격 저장소의 현재 체크아웃된 마스터 분기에 영향을 주지 않습니다.노트북에서 이 작업을 수행하려면 명령이 매우 간단합니다.

git push origin master:laptop-master

즉, 로컬 마스터 분기가 원격 리포지토리의 "랩톱-마스터"라는 분기로 푸시됩니다.원격 저장소에는 "랩톱 마스터"라는 새 분기가 있으며, 준비가 되면 원격 마스터에 병합할 수 있습니다.

대체 옵션

master -> master를 그냥 누르는 것도 가능하지만, 일반적으로 현재 체크아웃된 non-bare repo의 지점으로 푸시하는 것은 권장되지 않습니다. 왜냐하면 무슨 일이 일어나고 있는지 이해하지 못하면 혼란스러울 수 있기 때문입니다.체크아웃된 분기로 푸시해도 작업 트리가 업데이트되지 않기 때문에 확인git status에 푸시된 체크아웃된 분기에서 가장 최근에 푸시된 분기와 정확히 반대되는 차이가 표시됩니다.푸시가 완료되기 전에 작업 트리가 더러웠다면 특히 혼란스러울 것입니다. 이것이 권장되지 않는 큰 이유입니다.

master -> master만 밀어보려는 경우 명령어는 다음과 같습니다.

git push origin

하지만 원격 저장소로 돌아가면 다음과 같은 작업을 수행할 가능성이 높습니다.git reset --hard HEAD작업 트리를 푸시된 콘텐츠와 동기화합니다.원격 작업 트리에 커밋되지 않은 변경 사항이 있으면 이 변경 사항이 삭제되므로 위험할 수 있습니다.사용하기 전에 결과가 무엇인지 확실히 알고 있거나, 최소한 먼저 백업을 만들어야 합니다!

편집 Git 2.3 이후에는 "배포 가능" git push: https://github.com/blog/1957-git-2-3-has-been-released 를 사용할 수 있습니다.그러나 별도의 분기로 푸시한 다음 병합하는 것이 실제 병합을 수행하기 때문에 일반적으로 더 좋습니다(따라서 병합과 마찬가지로 커밋되지 않은 변경 사항과 함께 작동함).

receive.denyCurrentBranch updateInstead

이 옵션Git 2.3에서 추가되었으며, Git 2.3이 정상일 경우 서버가 작업 트리를 업데이트하도록 합니다.

따라서 로컬로 풀하기 전에 항상 커밋하고 서버에서 새 작업 트리를 유지하는 경우( 병합 충돌을 방지하기 위해 수행해야 함) 이 옵션이 좋은 해결책입니다.

샘플 사용량:

git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead

cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master

cd ../server
ls

출력:

a
b

서버에 기본 리포지토리와 로컬 작동(비기본) 리포지토리를 설치하는 것이 좋습니다.랩톱에서 서버 베어 레포로 변경 사항을 푸시한 다음 해당 베어 레포에서 서버 작업 레포로 풀 수 있습니다.제가 이 말을 하는 이유는 서버에 노트북에 복제하려는 완전한/불완전한 분기가 많이 있을 수 있기 때문입니다.

이렇게 하면 변경사항을 서버로 푸시하는 동안 서버 작업 보고서에서 체크아웃된 분기의 상태에 대해 걱정할 필요가 없습니다.

다른 옵션은 푸시 대신 풀링할 수 있도록 역방향 SSH 터널을 설정하는 것입니다.

# start the tunnel from the natted box you wish to pull from (local)
$ ssh -R 1234:localhost:22 user@remote

# on the other box (remote)
$ git remote add other-side ssh://user@localhost:1234/the/repo
$ git pull other-side

터널을 백그라운드에서 실행하려면

$ ssh -fNnR 1234:localhost:22 user@remote

할 수 있는 일:

$git config --bool core.bare true

맨 저장소 또는 중앙 저장소에서 수행할 수 있으므로 맨 저장소가 아닌 저장소에서 푸시된 모든 파일을 허용합니다.베어가 아닌 저장소에서 이 작업을 수행하면 베어가 아닌 저장소에서 베어가 아닌 저장소로 파일을 푸시할 수 없습니다.

PC에 중앙 저장소와 비어 있지 않은 저장소를 만들어 GIT를 연습하는 경우 일부 PC에서 푸시된 파일이 표시되지 않을 수 있지만 푸시된 파일은 표시되지 않습니다.실행하면 확인할 수 있습니다.

$git log중부 레포에

GitHub에 푸시하는 경우를 제외하고는 GitHub에 파일이 표시됩니다.

언급URL : https://stackoverflow.com/questions/1764380/how-to-push-to-a-non-bare-git-repository

반응형