Kiedy uruchamiam git remote -v
w jednym z moich repozytoriów Git, który ma skonfigurowany pilot (y), widzę, że każdy pilot ma zarówno specyfikacje pobierania, jak i przesyłania:
$ git remote -v
<remote-name> ssh://host/path/to/repo (fetch)
<remote-name> ssh://host/path/to/repo (push)
W przypadku pilotów, które wskazują równorzędnym programistom, nie ma potrzeby wypychania, a Git i tak odmówi wysłania do nie-gołego repozytorium. Czy istnieje sposób skonfigurowania tych pilotów jako „tylko do pobierania”, bez adresu lub funkcji push?
Odpowiedzi:
Nie sądzę, aby można było usunąć adres URL push, można go tylko zastąpić innym niż adres URL pobierania. Myślę więc, że najbliższe będzie coś takiego:
Ustawiasz adres URL wypychania na
no-pushing
, którego git nie będzie w stanie zlokalizować, dopóki nie masz folderu o tej samej nazwie w katalogu roboczym. Zasadniczo zmuszasz git do korzystania z lokalizacji, która nie istnieje.źródło
git remote set-url --push origin -- --read-only--
- zwróć uwagę na dodatek,--
aby zezwolić na nazwę z początkowymi myślnikami. Wydało mi się to bardziej czytelne.Oprócz zmiany adresu URL push na nieprawidłowy (np.
git remote set-url --push origin DISABLED
), Można również użyćpre-push
hooka.Jednym z szybkich sposobów zatrzymania
git push
jest użycie linku symbolicznego,/usr/bin/false
który ma być hakiem:Użycie haka pozwala na dokładniejszą kontrolę pchnięć, jeśli jest to pożądane. Zobacz
.git/hooks/pre-push.sample
przykład, jak zapobiegać wypychaniu zatwierdzeń pracy w toku.Aby zapobiec wypychaniu do określonej gałęzi lub ograniczyć wypychanie do jednej gałęzi, w przykładzie haka:
$ 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" ]]
Repozytorium testowe z wieloma pilotami:
Pchanie do
origin
jest dozwolone:Pchanie do innego pilota jest niedozwolone:
Należy zauważyć, że
pre-push
skrypt przechwytujący można zmodyfikować, aby, między innymi, wypisywać na stderr komunikat informujący, że wypychanie zostało wyłączone.źródło
Ogólne stwierdzenie „Git odmówi wypychania do nie-nagiego repozytorium” nie jest prawdziwe. Git odmówi wypchnięcia do innego niż nagie repozytorium zdalnego, jeśli spróbujesz wypchnąć zmiany, które znajdują się w tej samej gałęzi, co wyewidencjonowany katalog roboczy repozytorium zdalnego.
Ta odpowiedź daje proste wyjaśnienie: https://stackoverflow.com/a/2933656/1866402
(Dodaję to jako odpowiedź, ponieważ nie mam jeszcze wystarczającej reputacji, aby dodawać komentarze)
źródło
Jeśli masz już zdalną konfigurację i po prostu chcesz zapobiec zrobieniu czegoś takiego jak przypadkowe naciśnięcie bezpośrednio do
master
lubrelease/production
, możesz temu zapobiecgit 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
Dla przypomnienia,
no_push
nie jest to specjalne imię. To tylko nazwa nieistniejącej gałęzi. Możesz więc użyć$ git config branch.master.pushRemote create_a_pr_and_do_not_push_directly_to_master
i będzie działać dobrze.Więcej informacji: git-config pushRemote
źródło
Jeśli masz kontrolę nad repozytorium, możesz to osiągnąć, korzystając z uprawnień. Użytkownik, który pobiera repozytorium, nie powinien mieć uprawnień do zapisu w repozytorium głównym.
źródło