Git'in simgeleri takip etmesini nasıl sağlayabilirim?


217

Elimden gelenin en iyisini yapmak sembolik bağları kopyalarla değiştiren bir kabuk komut dosyası mı olacak yoksa Git'e sembolik bağları izlemesini söylemenin başka bir yolu var mı?

Not: Çok güvenli olmadığını biliyorum, ama sadece birkaç özel durumda yapmak istiyorum.


5
böyle bir şey için sabit bağlantılar kullanmanın bir dezavantajı var mı?
Ehtesh Choudhury

12
Windows 7 ile "mklink / d" (dizin sembolik bağlantısı) git ile çalışmaz, ancak "mklink / j" (juction) düzgün çalışır.
yoyo

1
Dosya, dosyayı silecek ve yeni bir dosya oluşturacak şekilde yeniden üreten bir uygulama tarafından otomatik olarak oluşturulduysa, evet, bu sorunların çözülmeyeceği sorunlardır.
Martin Pecka

1
@EhteshChoudhury dizinler için zor bağlantılar yapamazsınız
Gaurav Kansal

Yanıtlar:


46

NOT: Bu tavsiye, Git 1.6.1'den bu yana yorum başına artık eskimiştir. Git eskiden böyle davrandı ve artık böyle davranmıyordu.


Git varsayılan olarak sembol bağlantılarını takip etmek yerine saklamaya çalışır (kompaktlık için ve genellikle insanların istediği şey budur).

Ancak, yanlışlıkla symlink bir dizin olduğunda symlink ötesinde dosya eklemek için almak başardı.

yani:

  /foo/
  /foo/baz
  /bar/foo --> /foo
  /bar/foo/baz

yaparak

 git add /bar/foo/baz

denediğimde işe yaradı. Ancak o zaman bu davranış benim tarafımdan istenmeyen bir durumdu, bu yüzden size bunun ötesinde bilgi veremem.


72
, Sen sembolik olarak dizinleri ötesine dosyaları ekleyerek durdurdu 725b06050a083474e240a2436121e0a80bb9f175 ve 806d13b1ccdbdde4bbdfb96902791c4b7ed125f6 tanıtıldı değişiklikleri taahhüt böylece 1.6.1 beri GYTE sürümlerinde bu olmaz işler
Mark Longair

1
$ git add src / main / path / ConvertSymlinkToDir ölümcül: 'src / main / path / ConvertSymlinkToDir' sembolik bir bağlantının ötesinde
user1767316

2
@ user1767316 her şeyi ve yorumları okuyun. Eskiden işe yaradı, artık yok. Yazılım değişir, ancak yığın taşması kabul edilen cevaplar değişmez. Bunun zaten işe yaramadığını açıkladım. Başka bir cevaba bak.
Kent Fredric

Evet @KentFrederic ancak tam hata iletisini döndürmek, kullanıcının sorununa çözüm aramasına yardımcı olur. downvote iptal etmeye çalıştı ama üzgünüm kilitlendi. Bir yandan, uyarı verildiğinde cevabınız doğru, öte yandan, geçmişte değil, şimdi çalışmaya cevap vermeye öncelik vermelidir
user1767316

144

Ne bir symlink içinde dosyaları Git içine eklemek için yaptım (Ben bir symlink kullanmadım ama):

sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

Bu komutu Git tarafından yönetilen dizinde yapın. içine monte TARGETDIRECTORYedilmeden önce oluşturulmalıdır SOURCEDIRECTORY.

Linux'ta iyi çalışıyor, ancak OS X'te çalışmıyor! Bu numara Subversion'da da bana yardımcı oldu. Bunu, bir web tasarımcının işlerini yaptığı bir Dropbox hesabındaki dosyaları dahil etmek için kullanıyorum.


8
Sudo wasnt gerekli çok güzel bir yaklaşım olurdu.
MestreLion

13
Bu bağlamayı geri almak için kullanın umount [mydir]. (Harika ipucunuz için +1, @ user252400)
JellicleCat

10
Bu yalnızca oturum sırasında çalışır. Onu "ebedi" yapmanın en iyi yolu nedir?
Adobe

17
@ Adobe: / etc / fstab içine koyun, şöyle: / sourcedir / targetdir none bind
Alexander Garden

8
sshfs burada sudo gerektirmeden bu tür bir numara elde edebilir.
PypeBros

75

Neden ters bağlantılar oluşturmuyorsunuz? Bunun anlamı Git deposundan uygulama dizinine bağlanmak yerine, tam tersini yapmaktır.

Örneğin, ~/applicationbir yapılandırma dosyasına ihtiyaç duyan yüklü bir uygulama ayarladığımı varsayalım config.conf:

  • config.confGit veri havuzuma ekliyorum , örneğin at ~/repos/application/config.conf.
  • Sonra ~/applicationçalıştırarak bir symlink oluşturun ln -s ~/repos/application/config.conf.

Bu yaklaşım her zaman işe yaramayabilir, ancak şu ana kadar benim için iyi çalıştı.


5
Tek yol gibi görünüyor ve o kadar da kötü değil ... Bence seninki oldukça zarif bir yaklaşım. git dosyaları değil içeriği izler. Tüm içeriği bir arada tutmak ve oradan başka yerlere bağlantı vermek mantıklı
MestreLion

12
Benim durumumda bir git repo diğerine bir bağlantı istedim, böylece her iki konumda dosyaları düzenleyebilir ve ilgili uzaktan kumandaları geri taahhüt. Windows 7'de bir kavşak ("mklink / j") işe yaradı.
yoyo

3
elbette. bazen cevap o kadar basittir.
Windows öncesi BBW

hem kaynağı hem de hedefi gitmek isterseniz ne olur? (çünkü her ikisi de farklı depolarda olmasını istediğiniz farklı kodlara aittir)
DrGC

1
Soruya cevap vermiyor :( Depomun bir kısmının iCloud'umla senkronize edilmesini istedim. Ne yazık ki, iCloud simgeleri takip etmiyor, bu yüzden git simgelerini takip edebilir ve orijinal dosyaları iCloud'da saklayabilirim diye düşündüm. simgeleri: \
Jerry Green

49

Bunun yerine sabit bağlantılar kullanın. Bu yumuşak (sembolik) bir bağlantıdan farklıdır. Tüm programlar da dahil olmak üzere gitdosyayı normal bir dosya olarak görür. İçindekiler değiştirerek değiştirilebilir unutmayın ya kaynak ya da hedef.

MacOS'ta (10.13 High Sierra'dan önce)

Git ve Xcode zaten yüklüyse, hardlink yükleyin . Sabit bağlantılar oluşturmak için mikroskobik bir araçtır .

Sabit bağlantı oluşturmak için basitçe:

hln source destination

macOS High Sierra güncellemesi

Apple Dosya Sistemi dizin sabit bağlantılarını destekliyor mu?

Dizin sabit bağlantıları Apple Dosya Sistemi tarafından desteklenmez. MacOS'ta HFS + 'dan APFS birim biçimlerine dönüştürdüğünüzde tüm dizin sabit bağlantıları sembolik bağlantılara veya takma adlara dönüştürülür.

Gönderen APFS SSS developer.apple.com üzerinde

İlerideki alternatifler için https://github.com/selkhateeb/hardlink/issues/31 adresini takip edin .

Linux ve diğer Unix lezzetlerinde

lnKomut sabit bağlantıları yapabilirsiniz:

ln source destination

Windows'ta (Vista, 7, 8,…)

Birisi Windows'da bir kavşak oluşturmak için mklink kullanmanızı önerdi , ancak denemedim:

mklink /j "source" "destination"

7
Sadece bir not: temelde aradığım şey bu oldu, ama sonra Linux'ta bir bağlantının maalesef dosya sistemi sınırlarını geçemediğini öğrendim (bu benim kullanım durumum).
sdaau

26
Dizinlere hardlink veremezsiniz, değil mi?
Nanne

1
ln source destinationOS X'te de çalışır. El Capitan üzerinde test edildi.
Mehdi Dibaiee

7
Hayır @Nanne, fakat yapabileceğin: cp -al source destination. `-l 'kopyalama yerine sabit bağlantı dosyaları anlamına gelir.
Paolo

6
Maalesef dizinleri veya dosya sistemi sınırları arasında sabit bağlantı kuramazsınız. Bu, bu çözümü iki kat işe yaramaz hale getiriyor.
Konrad Rudolph

25

Bu bir ön taahhüt kancası indeksteki sembolik blokları bu sembollerin içeriğiyle değiştiren kancasıdır.

Bunu koyun .git/hooks/pre-commitve çalıştırılabilir yapın:

#!/bin/sh
# (replace "find ." with "find ./<path>" below, to work with only specific paths)

# (these lines are really all one line, on multiple lines for clarity)
# ...find symlinks which do not dereference to directories...
find . -type l -exec test '!' -d {} ';' -print -exec sh -c \
# ...remove the symlink blob, and add the content diff, to the index/cache
    'git rm --cached "$1"; diff -au /dev/null "$1" | git apply --cached -p1 -' \
# ...and call out to "sh".
    "process_links_to_nondir" {} ';'

# the end

notlar

POSIX uyumlu işlevselliği mümkün olduğunca kullanıyoruz; ancak,diff -a muhtemelen diğer şeylerin yanı sıra POSIX uyumlu değildir.

Biraz test edilmesine rağmen bu kodda bazı hatalar / hatalar olabilir.


4
Dizinler için değil, dosyalar için soruyu gerçekten cevaplama girişimi görmek harika. Ancak, nota yukarıda gösterilmeye devam edeceğini typechangede git statusdeğiller şeyler şimdi git olsa aslında sembolik bağ vardır dosyalar için.
David Fraser

1
Bunun için teşekkürler; sadece bilmek istedim, nedir process_links_to_nondir?
sdaau

@sdaau İşlem argv[0]için komut adı olarak kullanılan / adıdır sh. (Bunu anlamaya çalıştığım için biraz aldım, çünkü ne olduğunu hatırlamıyorum ☺😃)
Abbafei

3
@Abbafei Ubuntu (14.04) üzerinde çalışmasını sağlamak için komut dosyasını değiştirebilir misiniz? Gösteriyor find: missing argument to -exec'. Her şeyi tek bir satırda birleştirmek ve birleştirmek yerine adım adım komut yürütme gerekebilir.
Khurshid Alam

1
@ KhurshidAlam Benim için komut satırları arasındaki yorum satırlarını kaldırmak için çalıştı. Ancak, kanca beklendiği typechangegibi çalışmaz ( like @DavidFraser'ı alırım, ancak bağlantılı dosya artık sahnelenmiş gibi görünmüyor)
Scz

14

Açık MacOS(Mojave / 10.14, gitsürüm 2.7.1) var, kullanın bindfs.

brew install bindfs

cd /path/to/git_controlled_dir

mkdir local_copy_dir

bindfs </full/path/to/source_dir> </full/path/to/local_copy_dir>

Diğer yorumlar tarafından ima edildi, ancak diğer cevaplarda açıkça belirtilmedi. Umarım bu biraz zaman kazandırır.


hepsi mac os üzerinde çalışan ekipler için harika görünüyor, aşağıda özetlenen sabit bağlantılar windows ve linux için çalışması gerektiğini düşünüyorum.
Devin G Rhode

Bu yardımcı oldu ve bence MacOS'ta kullanışlı ama eksik bir yetenek için en iyi çözüm. Ben başlamıştı Ancak unutmayın Failed to resolve... No such file or directoryhatalar olmadıkça kullandığım tam yol adları ile bindfskomuta.
electromaggot

Teşekkürler @electromaggot. Tam yolların gerekli olduğuna dair açıklama eklendi
ijoseph

1
Catalina macos harika çalışıyor!
Jerry Green

13

Bir süredir sembolik bağlantıların ötesine dosya eklerdim. Bu, herhangi bir özel düzenleme yapmadan gayet iyi çalışırdı. Git 1.6.1'e güncellediğimden, bu artık çalışmaz.

Bunu yapmak için Git 1.6.0'a geçebilirsiniz. Git'in gelecekteki bir sürümünün, git-addsimgeleri tekrar izlemesine izin veren bir bayrağı olacağını umuyorum .


12

Burada eski ya da kök gerektiren her çözümden bıktım, bu yüzden LD_PRELOAD tabanlı bir çözüm yaptım (sadece Linux).

Git'in iç kısmına takılıyor, 'Bu bir sembolik mi?' işlevi, semboliklerin içeriği olarak ele alınmasını sağlar. Varsayılan olarak, repo dışındaki tüm bağlantılar satır içine alınır; ayrıntılar için bağlantıya bakın.


LD_PRELOADKütüphane işlevlerini geçersiz kılmak için çok yaratıcı bir çözüm !
iBug

Evet, ama burada detaylandırılmalıdır. Bunu yapabilir misin?
Peter Mortensen

Ne kadar özenle yardımcı olacağından emin değilim; tüm kaynak kodunu kopyalayamadıkça, bu cevap her zaman bir benioku dosyasının da bulunduğu bağlantıya dayanacaktır. Ama evet, sanırım benioku dosyasının önemli kısımlarını yeniden üretebilirim.
Alcaro

Bu OS X'te derlenmez (Mojave 10.14.2). 'Strchrnul' ('strchr' demek istediniz mi?) Ve '__xstat64' hakkında bir tane ('__lxstat64' demek istediniz mi?) Hakkında şikayet eden dört hata alın. Son olarak, "dirent64" türünde üye erişimi hatası alıyorum. "Make", "make OPT = 1" veya "sh install.sh" komutlarını kullanırsam olur.
Erik Veland

@ErikVeland Biraz denedim, ancak OSX LD_PRELOAD'ı veya benzer bir şeyi desteklemiyor gibi görünüyor. Çeşitli dokümanlar çeşitli şeyler önerir, ancak hepsi birkaç yaşındadır ve Apple şeyleri sevmemeyi sever; Hiçbirini çalıştıramadım. Afedersiniz.
Alcaro

6

Git ile 2.3.2+ (Q1 2015), Git olacak bir başka durum var değil artık sembolik izleyin: bkz e0d201b taahhüt tarafından Junio C Hamano ( gitster) (ana Git sürdürme)

apply: sembolik bağlantının ötesindeki bir dosyaya dokunma

Git sembolik bağlantıları sembolik bağlantılar olarak izlediğinden, ön kısmında sembolik bir bağlantı bulunan bir yol (örneğin path/to/dir/file, path/to/dirçalışma ağacının içinde veya dışında başka bir yere sembolik bir bağlantı olduğu), geçerli olarak geçerli olan bir yamada asla görünemez , aynı yama ilk olarak orada bir dizinin oluşturulmasına izin vermek için sembolik bağlantıyı kaldırmazsa.

Böyle bir yamayı tespit edin ve reddedin.

Benzer şekilde, bir girdi sembolik bir bağlantı path/to/diroluşturup daha sonra bir dosya path/to/dir/fileoluşturduğunda path/to/dir, dosya sisteminde gerçekten sembolik bir bağlantı oluşturmadan bunu bir hata olarak işaretlememiz gerekir .

Bunun yerine, girişte sonuçta bir yol bırakan (yani silinmeyen) herhangi bir yama için, girişteki tüm yamaları ve daha sonra yamanın hedefini inceleyerek, yamanın oluşturduğu ağaca karşı tüm önde gelen yolları kontrol ederiz. uygulama (dizin veya çalışma ağacı).

Bu şekilde:

  • aynı anda sembolik bir bağlantı path/to/dirve bir dosya eklemek için bir yaramazlık veya hata yakalayın path/to/dir/file,
  • bir sembolik olan link path/to/dirve daha sonra bir dosya ekleyen geçerli bir yamaya izin verir path/to/dir/file.

Bu, bu durumda, hata mesajının genel bir mesaj değil "%s: patch does not apply", daha spesifik bir mesaj olduğu anlamına gelir :

affected file '%s' is beyond a symbolic link

4

Hmmm, mount --bindDarwin üzerinde çalışmıyor gibi görünüyor.

Herhangi bir hile var mı?

[Düzenlenmiş]

Tamam, Mac OS X'te bir sabit bağlantı yapmak için yanıt buldum. Bu API'nın açıkta kalmaması dışında, lnbunu yapmak için kendi küçük programınızı kullanmanız gerekir. İşte bu programın bağlantısı:

Mac OS X'te dizin sabit bağlantıları oluşturma

Zevk almak!


1
Bu sabit bağlantının hedef dizini başka bir git deposunun alt dizini ise, bu bir kaos olur. Sabit bağlantıda git işlemlerinin yapılması bu diğer git repo için geçerli olacaktır. Ne yaptığınızı bir kez daha kontrol edin.
yegle

4
Bunu , port kullanılarak kurulabilen code.google.com/p/bindfs adresinden yapmak mümkündür .
Kit Sunde

0

Git 1.5.4.3 kullanıyorum ve sondaki eğik çizgi varsa geçen symlink'i takip ediyor. Örneğin

# Adds the symlink itself
$ git add symlink

# Follows symlink and adds the denoted directory's contents
$ git add symlink/

5
en azından OSX'te bu sonuçfatal: 'src/' is beyond a symbolic link
Dan Rosenstark

2
@Mark Longair tarafından açıklandığı gibi, bu sadece git
1.6.1'e

bu benim sorunumdu, teşekkürler!
Mike Q

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.