힘내 : 가져 오기 전용 리모컨을 설정 하시겠습니까? 리포지토리 중 하나에서 실행할 때 각

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

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

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



답변

푸시 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이 존재하지 않는 위치를 사용하도록 강요하고 있습니다.


답변

푸시 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에 메시지를 인쇄 수정 될 수는 사용할 수 없습니다.


답변

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

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

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


답변

이미 리모컨이 설치되어 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


답변

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


답변