Git: Yalnızca getirme uzaktan kumandası mı kurulsun?


132

git remote -vYapılandırılmış uzak (lar) ı olan Git depolarımdan birinde çalıştırdığımda , her bir uzaktan kumandanın hem getirme hem de iletme özelliklerine sahip olduğunu görüyorum:

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

Eş geliştiricilere işaret eden uzaktan kumandalar için zorlamaya gerek yoktur ve Git yine de çıplak olmayan bir depoya göndermeyi reddedecektir. Bu uzaktan kumandaları herhangi bir push adresi veya yeteneği olmayan "yalnızca getirme" olarak yapılandırmanın bir yolu var mı?


4
@sehe, hayır, yapamazsınız. İtme URL'si belirtilmeden, aktarmalar getirme URL'sini kullanır.
yoyo

Yanıtlar:


191

Push URL'yi kaldırabileceğinizi sanmıyorum , sadece çekme URL'si dışında bir şey olması için geçersiz kılabilirsiniz . Bu yüzden alacağın en yakın şey şöyle bir şey:

$ 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

no-pushingÇalışma dizininizde aynı ada sahip bir klasörünüz olmadığı sürece git'in bulamayacağı bir itme URL'sini ayarlıyorsunuz . Aslında git'i var olmayan bir konumu kullanmaya zorluyorsunuz.


14
Evet, "git remote set-url --delete --push. *" Hile yapacağını düşünürdünüz, ancak push url'yi silerseniz, o zaman varsayılan olarak getirme url'sine geri döner.
yoyo

6
Ben şahsen daha görünür, ' DEVRE DIŞI ' gibi bir şeyin kullanılmasını tercih ediyorum . Ama bu sadece bir zevk meselesi.
Pierre-Olivier Vares

Pierre-OlivierVares @ ne hakkında 'DONTPUSH' ?! :)
Ali Shakiba

Bilginize, bunu yaptıktan sonra git yapılandırma dosyanız şöyle görünmelidir: (Yeni pushurl seçeneğine dikkat edin) [remote "origin"] fetch = + refs / Heads / *: refs / remotes / origin / * url = ssh: // host / / yol / repo pushurl = ssh: // host / no-itme / repo
jaywilliams

1
@ Pierre-OlivierVares'e benzer şekilde, ben de gittim git remote set-url --push origin -- --read-only--- baştaki --çizgilerle bir isme izin vermek için fazlalıklara dikkat edin . Bu bana daha okunaklı geldi.
lindes

13

İtme URL'sini geçersiz bir şeye değiştirmenin yanı sıra (örneğin git remote set-url --push origin DISABLED), pre-pushkancayı da kullanabilirsiniz .

Durdurmanın hızlı bir yolu , kanca olmak git pushiçin sembolik bağ kurmaktır /usr/bin/false:

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

Bir kanca kullanmak, istenirse itmelerin daha hassas kontrolüne izin verir. .git/hooks/pre-push.sampleDevam eden iş taahhütlerinin zorlanmasının nasıl önleneceğine dair bir örnek için bakın .

Belirli bir dala itmeyi önlemek veya tek bir dala itmeyi sınırlamak için, bu örnek bir kancada:

$ 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" ]]

Birden çok uzaktan kumandalı bir test deposu:

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

İtmeye originizin verilir:

$ 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

Başka bir uzaktan kumandaya itmeye izin verilmez:

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

pre-pushDiğer şeylerin yanı sıra , kanca komut dosyasının değiştirilerek stderr'e itmenin devre dışı bırakıldığını belirten bir mesaj yazdırılabileceğini unutmayın.


İyi bir fikir! Daha ayrıntılı bir komut dosyası olmadan tüm uzaktan kumandalar için itmeyi devre dışı bırakırsınız tho.
v01pe

1
@ v01pe evet. Yanıtı, örnek bir komut dosyası içerecek şekilde güncelledim. Tek bir dala itmeleri filtrelemek için çok fazla şeye ihtiyaç duymaz. Bir kabuk tek astarı işe yarar.
Rodolfo Carvalho

4

"Git, çıplak olmayan bir depoya göndermeyi reddedecek" genel ifadesi doğru değildir. Git, yalnızca uzak deponun teslim alınmış çalışma dizini ile aynı dalda bulunan değişiklikleri göndermeye çalışıyorsanız, çıplak olmayan bir uzak depoya göndermeyi reddeder.

Bu cevap basit bir açıklama verir: https://stackoverflow.com/a/2933656/1866402

(Bunu bir yanıt olarak ekliyorum çünkü henüz yorum eklemek için yeterli itibarım yok)


çıplak bir deponun tanımı gereği teslim alınmış bir çalışma dizini yoktur. Bununla birlikte, belirli bir dala itebilirsiniz.,
Ed Randall

1

Halihazırda bir uzaktan kurulumunuz varsa ve sadece yanlışlıkla masterveya doğrudan itmek gibi bir şey yapmaktan kendinizi release/productionengellemek istiyorsanız, bunu kullanmayı önleyebilirsiniz 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

Kayıt no_pushiçin özel bir isim değil. Varolmayan herhangi bir şubenin adı. Böylece kullanabilirsiniz $ git config branch.master.pushRemote create_a_pr_and_do_not_push_directly_to_masterve gayet iyi çalışır.

Daha fazla bilgi: git-config pushRemote


0

Depo üzerinde kontrolünüz varsa, izinleri kullanarak bunu başarabilirsiniz. Depoyu getiren kullanıcının ana depoda yazma izinlerine sahip olmaması gerekir.


Dosyaları değiştiremezseniz, yeni değişiklikleri de alamazsınız.
Sadece bir öğrenci
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.