베어가 아닌 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
'prosource' 카테고리의 다른 글
파일 이름별 킬 프로세스 (0) | 2023.08.16 |
---|---|
Google 지도 스타일 스크롤 사용자? (0) | 2023.08.16 |
?:, ?!와 ?=의 차이 (0) | 2023.08.11 |
라라벨 5의 AJAX 통화에서 뷰를 반환하려면 어떻게 해야 합니까? (0) | 2023.08.11 |
Android M 권한 : showRequestPermissionRationale() 함수의 사용법이 헷갈립니다. (0) | 2023.08.11 |