2009-02-09 11 views
34

Po git clone, config w nowym repo wygląda następująco:Jak skonfigurować git aby uniknąć przypadkowego git push

remote.origin.url=<some url> 
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* 
branch.master.remote=origin 
branch.master.merge=refs/heads/master 

Następnie można wykonać "git pull" i "git push". Ale interesuje mnie tylko "git pull", ponieważ chcę wprowadzić kolejne repo.

Jedno co mogę zrobić to:

git add remote repo-for-push <some other url> 
git push repo-for-push master 

Ale chciałbym skonfigurować git użyć domyślnych i różne repozytoria do ciągnięcia i pchania, tj

git pull # pulls from origin 
git push # pushes into repo-for-push, avoiding accidental push into the origin 

Jak to może być skonfigurowany ? Z góry dzięki.

EDYCJA: Zasadniczo chcę ustawić domyślne push repo, aby różniło się od domyślnego repozytorium pobierania/pobierania.

+0

więc w zasadzie chcesz Setup domyślne repozytorium push różni się od domyślnego repozytorium pobierania/pobierania, prawda? może powinieneś to wyjaśnić. – kch

+2

prawo, to samo, ale z mniejszą ilością słów, :) –

Odpowiedz

34

Wygląda

git config remote.origin.receivepack /bin/false 

Sprawia push pochodzenia zdalnego niepowodzeniem.

+0

Świetne !!!! Właśnie tego szukałem. –

+0

Czy niektóre protokoły są tylko do odczytu? Spowoduje to również niepowodzenie pchania do niewłaściwego repozytorium. –

+0

@Andrew: Tak, jeśli sklonujesz za pomocą protokołu git, zostaniesz ustawiony. – Cascabel

7

Nie jestem pewien, czy możesz to zrobić dzisiaj w git. Implementacja git-fetch (w wbudowanym-fetch.c) i git-push (w builtin-push.c) wywołuje wewnętrzną funkcję remote_get (NULL), aby zidentyfikować domyślne repozytorium do pull-from/push-to.

Jedną opcją byłoby utworzenie aliasu określającego pożądane repozytorium. Na przykład:

git config --add alias.mypush "push repo-for-push" 

następnie można:

git mypush 

pchnąć do żądanej repo. Nie dokładnie to, czego chcesz, oczywiście. (Możesz także wziąć pod uwagę argument --popo, aby przekazać, zobacz http://kerneltrap.org/mailarchive/git/2008/10/7/3537694 dla ostatniej aktualizacji dokumentu, która wyjaśnia argument --repo.)

+0

Oba pseudonimy "push repo-for-push" i "push - repo-for-push" są dobrym rozwiązaniem. Dzięki. –

+0

Jak zauważono w odpowiedzi od @Novelocrat, od wersji 1.6.4 nie jest to już prawdą. –

0

Jeśli możesz zrobić całe przesuwanie z innej gałęzi, myślę, że możesz skonfigurować że oddział mieć osobne repozytorium do pchania do:

git checkout master 
git branch outbound 
git remote add destination <some url> 
git config branch.outbound.remote destination 

nie próbowałem tego, a może trzeba zrobić trochę więcej pracy, aby stworzyć kompletne rozwiązanie. Może również nie działać dla ciebie, jeśli musisz naciskać od mistrza.

+0

Dzięki temu rozwiązaniu muszę ręcznie połączyć oba odgałęzienia i być świadomym bieżącego odgałęzienia do git push xor git pull poprawnie. Nie ma lepszego niż aliasy, jeśli nie jestem w stanie skonfigurować gita, aby uniknąć/anulować/zabronić ciągnięcia git lub push, gdy aktualna gałąź nie jest właściwa. Dzięki! –

+0

Jak wspomniano w odpowiedzi z @Novelocrat, nie jest to już wymagane. –

0

Zawiń polecenie "git" w coś, co zjada argument push. Od szczytu głowy to pisałem:

 
~$ cat /usr/local/bin/git 
#!/bin/bash 

# git wrapper 
# prevents pushing to repository 

declare -a args 
declare msg='' 
while [ $# -gt 0 ] 
do 
    if [ "$1" != 'push' ]; then 
     args=("${args[@]}" "$1") 
    else 
     msg="No pushing" 
    fi 
    shift 
done 

if [ ${#msg} -gt 0 ]; then 
    echo "$msg" 
fi 
/usr/bin/git "${args[@]}" 

Tylko pamiętaj, aby mieć zawinięty polecenia w swojej ścieżce przed „prawdziwym” polecenia git.

+0

Dobry pomysł, ale powinien znajdować się w systemie plików użytkownika i powinien sprawdzić bieżący katalog roboczy, gdy istnieje kilka repozytoriów bez tego ograniczenia. Dzięki. –

27

W wersji 1.6.4 Git uzyskał możliwość zdalnego pobierania z jednego adresu URL i przesyłania danych do innego przy użyciu ustawienia konfiguracyjnego remote.name.pushurl. Mogę sobie wyobrazić dziwne zachowanie, jeśli repozytorium push nie śledzi repozytorium ściąganego, ale podejrzewam, że Git będzie po prostu próbował szybko przesłać repozytorium push z bieżącej/śledzącej/dopasowującej gałęzi (-ek) bez względu na to, co to jest będzie ciągnąć, gdy zapyta pilota o tej samej nazwie.

Na przykład, jeśli chcesz ciągnąć za pośrednictwem anonimowego protokołu git, ale pchania przez SSH (być może trzeba wartość Off SecurID tokena lub coś do uwierzytelnienia):

[remote "myremote"] 
    url = git://server/path 
    pushurl = [email protected]:/path