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


150

나는 보통 Git 저장소가있는 ssh (screen and vim)를 통해 원격 서버에서 작업합니다. 때로는 온라인 상태가 아니므로 랩톱에 별도의 저장소 (리모콘에서 복제)가 있습니다.

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

나는 맨손으로 저장소로 밀어야한다는 것을 읽었습니다. 그런 다음 변경 사항을 원격 저장소에 어떻게 적용해야합니까?



3
원격 리포지토리 2 개 (맨손 및 일반)가 있으며 후크를 사용하십시오. 번거로운 것처럼 보이지만 git ready공식 git wiki에 따르면 맨손으로 리포지토리로 밀어야합니다 . 이것이 아마도 대부분의 git repo 호스트 (예 : GitHub, Bitbucket)가 수신 후 후크를 포함하는 이유 일 것이므로 예를 들어 실행하는 스크립트를 실행하는 서버의 URL에 POST 할 수 있습니다 git pull github master.
Jake Berger

답변:


137

receive.denyCurrentBranch updateInstead

이 옵션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

heroku처럼 맨손으로 레포를 만들지 않고 밀어 넣을 수
있습니까

2
@ANinJa 이해가되지 않습니다. 제 예제가 정확히 그렇습니까?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

이다 --local선택?
Yukulélé

Yukulélé는 @ --local만 현재 디렉토리에 영향을 미치는 --global모든 자식의 repos에 영향을 미치는 ~/.gitconfig, 참조 man git-config.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
문서를 읽은 후 @CiroSantilli 新疆 改造 中心 六四 事件 法轮功에게 감사합니다 "필자는 --local이라고 말할 수 있지만 기본값입니다)"
Yukulélé

146

최고의 옵션

맨손이 아닌 원격 저장소로 푸시하는 가장 깨끗하고 혼란스럽고 안전한 방법은 랩톱 지점을 나타내는 리모콘의 전용 지점으로 푸시하는 것입니다.

가장 간단한 경우를 살펴보고 각 리포지토리에 마스터가 하나만 있다고 가정합니다. 마스터-> 마스터를 누르는 대신 랩톱에서 원격 저장소로 푸시 할 때 마스터-> 랩톱 마스터 (또는 유사한 이름)를 누릅니다. 이런 방식으로 푸시는 원격 저장소의 현재 체크 아웃 된 마스터 브랜치에 영향을 미치지 않습니다. 랩톱 에서이 작업을 수행하려면 명령이 매우 간단합니다.

git push origin master:laptop-master

이는 로컬 마스터 분기가 원격 저장소에서 "laptop-master"라는 분기로 푸시됨을 의미합니다. 원격 리포지토리에는 "랩탑 마스터"라는 이름의 새 브랜치가 있으며 준비가되면 원격 마스터에 병합 할 수 있습니다.

대체 옵션

master-> master를 밀어 넣는 것도 가능하지만 현재 진행중인 베어 아웃 저장소의 현재 체크 아웃 된 분기로 밀어 넣는 것은 권장되지 않습니다. 진행 상황을 이해하지 못하면 혼동 될 수 있기 때문입니다. 체크 아웃 된 분기로 푸시해도 작업 트리가 업데이트되지 않기 때문에 푸시 된 체크 아웃 분기 git status에서 체크인하면 가장 최근에 푸시 된 것과 정확히 반대의 차이가 표시됩니다. 푸시가 완료되기 전에 작업 트리가 더러워지면 특히 혼란 스러울 것입니다. 이것이 권장되지 않는 큰 이유입니다.

master-> master를 누르려고하면 명령은 다음과 같습니다.

git push origin

그러나 원격 리포지토리로 돌아 가면 git reset --hard HEAD푸시 된 콘텐츠와 작업 트리를 동기화하기를 원할 것입니다. 유지하려는 원격 작업 트리에 커밋되지 않은 변경 사항 이 있으면 지워 지기 때문에 위험 할 수 있습니다 . 시도하기 전에이 결과가 어떤 영향을 미쳤는지 확인하거나 최소한 백업을 먼저 수행하십시오!

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


1
랩탑 마스터를 누른 후 분기를 자동화 할 수 있습니까?
rdoubleui

3
@rdoubleui : " 병합 자동화"를 의미 했습니까 ? 그렇다면 사람이 개입하지 않으면 병합이 가능하지 않기 때문에 병합을 자동화 할 수 없습니다. 정리해야 할 충돌이있을 수 있습니다.
Dan Molding

7
(?) 이후 버전에서, git config receive.denyCurrentBranch ignore비 베어의 repos에 밀어 전에 수행해야합니다
prusswan

3
좋은 답변 @ DanMoulding, 감사합니다. @rdoubleui : 항상 다음과 같은 명령 행을 bash 함수로 저장할 수 있습니다.git push origin master:laptop-master && ssh user@remotemachine 'cd repos_path && git merge laptop-master'
Rich

@rdoubleui는 병합을 자동화하기 위해 gitolite를 사용하여 비 베어 베어가 모든 것을 더티 커밋하고 프리 git 트리거를 사용하여 gitolite (bare) 버전으로 푸시하도록 약간 복잡하게 설정할 수 있습니다. 그 후에 비 베어에서 병합을 해결할 수 없으면 푸시를 거부하므로 먼저 당기고 병합을 해결하고 다시 푸시해야한다는 것을 알 수 있습니다. 아직 설정하지 않았지만 진행 중이며 작동 할 수 있다고 생각합니다.

17

서버에 베어 리포지토리와 로컬 작업 (비 베어) 리포지토리를 갖는 것이 좋습니다. 랩톱에서 서버 베어 저장소로 변경 사항을 푸시 한 다음 해당 베어 저장소에서 서버 작업 저장소로 끌어 올 수 있습니다. 내가 말하는 이유는 서버에 랩톱에서 복제하려는 완전 / 불완전한 분기가 많이있을 수 있기 때문입니다.

이렇게하면 서버 변경 사항을 서버로 푸시하면서 서버 작업 저장소에서 체크 아웃 된 지점의 상태에 대해 걱정할 필요가 없습니다.


4

또 다른 옵션은 역방향 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

1

넌 할 수있어:

$git config --bool core.bare true

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

PC에서 중앙 및 비 베어 리포지토리를 만들어 GIT을 연습하는 경우 일부 PC에서는 푸시 된 파일이 표시되지 않지만 푸시되었습니다. 당신은 그것을 실행하여 확인할 수 있습니다.

$git log 중앙 저장소에서.

GitHub로 푸시하는 것 외에 파일이 표시됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.