Git'teki bir kancaya sembolik bağlantı


86

Kendi özel post-birleştirme kancamı yazdım, şimdi ana proje klasörüme bir "hooks" dizini ekledim (git, .git / hooks içindeki değişiklikleri izlemediğinden), okuduğum bir yerde kancalardan sembolik bir bağlantı yapabileceğimi .git / hooks'a, böylece birisi onu her değiştirdiğinde dosyayı bir klasörden diğerine kopyalamam gerekmeyecek, ben de denedim:

ln -s -f hooks/post-merge .git/hooks/post-merge

Ama işe yaramıyor gibi görünüyor, herhangi bir fikriniz var mı? "ln hooks / post-merge .git / hooks / post-merge" iyi çalışıyor ancak sabit bir bağlantı kurmak, sanırım kopyalamayla aynı şey ...


22
Çünkü sembolik bağ konumuna göre çözülür. Bir sembolik link .git/hooks/o noktaya hooks/post-mergeşekilde çözüme kavuşturulacağını .git/hooks/hooks/post-mergeyok ki. Sen istiyorsun ln -s -f ../../hooks/post-merge .git/hooks/post-merge. Ya hayatınızı kolaylaştıracak: ln -s -f ../hooks .git/hooks. Senin sorunun git ile ilgisi yok.
Aristotle Pagaltzis


Yanılıyorsam düzeltin, ancak yine de iş istasyonu başına bir Symlink kurulması gerekir. Bunun kaydettiği tek şey, onu elle kopyalamak veya izlenen kanca dosyasını içine kopyalayan başka bir komut yazmaktır .git/hooks.
adi518

Yanıtlar:


161

Yanlış yolu kullandın, şu olmalı:

ln -s -f ../../hooks/post-merge .git/hooks/post-merge

10
Bulunduğum klasörde bulunan bir kaynağı birbirine bağlamak için neden iki dizine gitmem gerektiğini anlamıyorum cd. Sadece olması gerekmiyor ln -s ./hooks/mu?
Droogans

45
Bu. Git sembolik .git/hooksbağı değerlendirirken, görünüşe göre bunu çalışma dizini olarak kullanıyor , bu nedenle göreli yollar bu dizine göre olmalıdır. Bu, daha fazla eğer ilk kendi kendini açıklayıcı cdiçine .git/hooksoradan göreli yol dışarı sembolik hazırlanmadan önce ve rakam.
Eliot

12
@Eliot, sembolik bağlantıların oluşturulması veya çözümlenmesi çalışma dizini tarafından etkilenmez. Verdiğiniz her şey lnhedef olarak saklanacak ve bağlantının konumuna göre çözülecektir.
Joó Ádám

2
@ JoóÁdám Haklısın. Yani buradaki sorun, orijinal komutun yanlış bir göreceli yol belirtmesidir. Yine de, bağlantıyı oluşturmadan önce cdiçine girmek .git/hooks, komutu yazmanıza yardımcı olacaktır, çünkü daha sonra doğru yola otomatik olarak tamamlayabilirsiniz.
Eliot

1
Bütün bunlar sonunda benim için çalıştı. Tek fark, kendi kendime bağlanıyor olmam prepare-commit-msg. Sorun şu ki, nano kullanarak commit mesajını düzenliyorsam, daha sonra Ctl + X çıktı, git, bu değişikliği yapmadan önce olduğu gibi iptal etmek yerine yine de bir commit tamamlıyor. Bu işlemin tamamlanmasına neden olmadan nano çıkışa sahip olmanın bir yolu var mı?
frakman1

15

Sembolik bağları kullanabildiğiniz gibi, git ayarlarınızda projeniz için kanca klasörünü de değiştirebilirsiniz:

git config core.hooksPath hooks/

Varsayılan olarak yereldir, bu nedenle diğer projeleriniz için git kancalarını mahvetmez. Bu depodaki tüm kancalar için çalışır, bu nedenle birden fazla kancanız varsa özellikle yararlıdır.

.git/hooks/Ekibinizle paylaşmak istemediğiniz özel kancalarınız varsa, bunları kancalara / ekleyebilir ve .gitignorepaylaşılmamaları için bir ekleyebilirsiniz .


Çok hoş! Kullanışlı bir numara :) Onları birer birer simgeleştirmekten çok daha geleceğe dönük görünüyor.
jkp

2

Bağlamadan önce dizini değiştirme

cd /path/to/project-repo/.git/hooks
ln -s -f ../../hooks/post-merge ./post-merge

cdln -s -f ../../hooks/post-merge
Şunlardan

0

Yol hesaplaması sembolik bağa göre yapılır. Bir örnek kullanarak anlayalım,

ln -s path/to/file symlink/file

Burada, dosyanın yolu aslında sembolik bağlantı yolundan göreli yol olmalıdır.
Sistem aslında dosya yolunu şu şekilde hesaplar symlink/path/path/to/file
Yukarıdaki komut şu şekilde yeniden yazılmalıdır

ln -s ../path/to/file symlink/path

Klasör yapısı,

/ kod
------ symlink / dosya
------ dosya / yol


0

Michael Cihar'ın yorumundan yararlanarak, işte bu sembolik bağları oluşturmak için yazdığım bir bash betiği örneği. Bu komut dosyası, proje kök dizininde bulunan git_hooks / dir içinde bulunur. .Git / klasörüm de aynı dizin seviyesinde.

#!/usr/bin/env bash

pwd=$(pwd);

# Script is designed to be ran from git_hooks/ dir
if [[ "$pwd" == *"git_hooks"* ]]; then

  files=$(ls | grep -v -e '.*\.');

   while read -r file; do

     ln -s ../../git_hooks/$file ../.git/hooks/
     echo "Linked $file -> ../.git/hooks/$file"

   done <<< "$files";

else

  echo "";
  echo "ERROR: ";
  echo "You must be within the git_hooks/ dir to run this command";
  exit 1;

fi

Betiğim gerçek git_hooks / dizininden çalıştırılmalıdır. İsterseniz farklı davranması için onu değiştirebilirsiniz.

Bu komut dosyası, git_hooks / dizini içinde bir dosya uzantısı ile son eki olmayan herhangi bir dosyayı sembolik bağlayacaktır. Bu dizinde + bu komut dosyasında (symlink.sh adında) bir README.txt var. Tüm gerçek git kancaları 'pre-commit', 'pre-push' vb. Olarak adlandırılır, böylece sembolik bağlantılı olurlar.


-2

neden sadece cp ./hooks/* .git / hooks /

bu benim için Mac OS'de çalıştı


15
ÇünküI don't have to copy the file from one folder to the other every time someone changes
George Dimitriadis
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.