힘내 : 가져 오기 전용 리모컨을 설정 하시겠습니까?


132

git remote -v리모컨이 구성된 Git 리포지토리 중 하나에서 실행할 때 각 리모컨에 페치 및 푸시 사양이 모두 있음을 알 수 있습니다.

$ git remote -v
<remote-name> ssh://host/path/to/repo (fetch)
<remote-name> ssh://host/path/to/repo (push)

동료 개발자를 가리키는 리모컨의 경우 푸시 할 필요가 없으며 Git은 어쨌든 비 저장 저장소로 푸시하지 않습니다. 푸시 주소 나 기능없이 이러한 리모트를 "페치 전용"으로 구성 할 수있는 방법이 있습니까?


4
@sehe, 아니, 당신은 할 수 없습니다. 푸시 URL을 지정하지 않으면 푸시는 가져 오기 URL을 사용합니다.
yoyo

답변:


191

푸시 URL을 삭제할 수 있다고 생각하지 않으며 풀 URL 이외의 것으로 만 재정의 할 수 있습니다. 그래서 당신이 얻을 수있는 가장 가까운 것은 다음과 같습니다.

$ git remote set-url --push origin no-pushing
$ git push
fatal: 'no-pushing' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

푸시 URL을로 설정하고 no-pushing있습니다. 작업 디렉토리에 동일한 이름의 폴더가 없으면 git을 찾을 수 없습니다. 본질적으로 git이 존재하지 않는 위치를 사용하도록 강요하고 있습니다.


14
예, "git remote set-url --delete --push. *"가 트릭을 수행한다고 생각하지만 푸시 URL을 삭제하면 기본값은 가져 오기 URL로 돌아갑니다.
yoyo

6
나는 개인적으로 ' DISALLOWED ' 와 같은 것을 선호합니다 . 그러나 그것은 맛의 문제 일뿐입니다.
Pierre-Olivier Vares

@ Pierre-OlivierVares 'DONTPUSH'는 어떻습니까?! :)
Ali Shakiba

참고로,이 작업을 수행 한 후 git 구성 파일은 다음과 같아야합니다 ((새로운 pushurl 옵션 참고 ) [원격 "origin"] fetch = + refs / heads / * : refs / remotes / origin / * url = ssh : // host / path / to / repo pushurl = ssh : // host / no-pushing / repo
jaywilliams

1
@ Pierre-OlivierVares와 마찬가지로, 나는 앞에 대시로 이름을 지정할 수있는 git remote set-url --push origin -- --read-only--추가 사항에 유의하십시오 --. 이것은 나에게 더 읽기 쉽다고 느꼈다.
lindes

13

푸시 URL을 잘못된 것으로 변경하는 것 외에도 (예 :) 후크를 git remote set-url --push origin DISABLED사용할 수도 있습니다 pre-push.

중지하는 빠른 방법 중 하나 는 후크 git push가되도록 symlink /usr/bin/false하는 것입니다.

$ ln -s /usr/bin/false .git/hooks/pre-push
$ git push
error: failed to push some refs to '...'

후크를 사용하면 원하는 경우 푸시를보다 세밀하게 제어 할 수 있습니다. .git/hooks/pre-push.sample진행중인 커밋을 푸시하지 못하게하는 방법에 대한 예를 참조하십시오 .

특정 분기로의 푸시를 방지하거나 단일 분기로의 푸시를 제한하려면 예제 후크에서 다음을 수행하십시오.

$ cat .git/hooks/pre-push
#!/usr/bin/sh

# An example hook script to limit pushing to a single remote.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If this script exits with a non-zero status nothing will be pushed.

remote="$1"
url="$2"

[[ "$remote" == "origin" ]]

여러 리모컨이있는 테스트 저장소

$ git remote -v
origin  ../gitorigin (fetch)
origin  ../gitorigin (push)
upstream        ../gitupstream (fetch)
upstream        ../gitupstream (push)

로 밀기 origin가능 :

$ git push origin
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 222 bytes | 222.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../gitorigin
 * [new branch]      master -> master

다른 리모컨으로 푸시하는 것은 허용되지 않습니다 :

$ git push upstream
error: failed to push some refs to '../gitupstream'

있습니다 pre-push후크 스크립트, 무엇보다도, 푸시 말 stderr에 메시지를 인쇄 수정 될 수는 사용할 수 없습니다.


좋은 생각! 더 정교한 스크립트가 없으면 모든 원격 장치에 대한 푸시를 비활성화합니다.
v01pe

1
@ v01pe 네. 예제 스크립트를 포함하도록 답변을 업데이트했습니다. 실제로 단일 분기로 푸시를 필터링 할 필요는 없습니다. 쉘 oneliner가 할 것입니다.
Rodolfo Carvalho

4

"Git이 비 베어 리포지토리로 푸시를 거부 할 것"이라는 일반적인 진술은 사실이 아닙니다. Git은 원격 저장소의 체크 아웃 된 작업 디렉토리와 동일한 브랜치에있는 변경 사항을 푸시하려고 시도하는 경우 베어 베어가 아닌 원격 저장소로의 푸시를 거부합니다.

이 답변은 간단한 설명을 제공합니다 : https : //.com/a/2933656/1866402

(아직 의견을 추가 할만 큼 평판이 충분하지 않기 때문에 이것을 답변으로 추가하고 있습니다)


Bare 저장소에는 정의에 따라 체크 아웃 된 작업 디렉토리가 없습니다. 당신은 그것에 특정 지점으로 밀 수 있습니다.,
Ed Randall

1

이미 리모컨이 설치되어 master있거나 실수로 직접을 누르는 등의 작업을 수행 release/production하지 못하게하려면을 사용하여이를 방지 할 수 있습니다 git config.

# prevent pushing to branch: master
$ git config branch.master.pushRemote no_push

# prevent pushing to branch: release/production
$ git config branch.release/production.pushRemote no_push

기록을 no_push위해 특별한 이름이 아닙니다. 존재하지 않는 지점의 이름 일뿐입니다. 그래서 당신은 사용할 수 $ git config branch.master.pushRemote create_a_pr_and_do_not_push_directly_to_master있고 잘 작동합니다.

추가 정보 : git-config pushRemote


0

저장소를 제어 할 수있는 경우 권한을 사용하여이를 달성 할 수 있습니다. 리포지토리를 가져 오는 사용자에게는 마스터 리포지토리에 대한 쓰기 권한이 없어야합니다.


파일을 수정할 수 없으면 새 변경 사항을 가져올 수 없습니다.
단지 학생
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.