Elimden gelenin en iyisini yapmak, sembolik linkleri kopyalarla değiştiren bir Shell script olacak mı yoksa Git'e sembolik linkleri takip etmenin başka bir yolu var mı?
Not: Çok güvenli olmadığını biliyorum, ancak bunu yalnızca birkaç özel durumda yapmak istiyorum.
NOT: Bu tavsiye, Git 1.6.1'den bu yana yorumlara göre güncellendi. Git bu şekilde davranırdı ve artık yapmaz.
Git, varsayılan olarak onları takip etmek yerine sembolik bağlantıları saklamaya çalışır (kompaktlık için ve genellikle insanların istediği budur).
Bununla birlikte, yanlışlıkla bir dizin olduğunda, işaretin ötesine dosya eklemeyi de başardım.
Yani .:
/foo/
/foo/baz
/bar/foo --> /foo
/bar/foo/baz
yaparak
git add /bar/foo/baz
denedim zaman işe yaradı. Ancak bu davranış o zamanlar benim için istenmeyen bir durumdu, bu yüzden size bunun ötesinde bilgi veremem.
Bir sembolik link içerisindeki dosyaları Git'e eklemek için ne yaptım?
Sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY
Bu komutu Git tarafından yönetilen dizinde yapın. TARGETDIRECTORY
içine SOURCEDIRECTORY
takılmadan önce oluşturulmalıdır.
Linux'ta iyi çalışıyor, ancak OS X'te değil! Bu numara bana Subversion'da da yardımcı oldu. Bir web tasarımcısının işlerini yaptığı bir Dropbox hesabından dosya eklemek için kullanıyorum.
Neden başka yollarda sembolik bağlantılar yaratmıyorsunuz? Git deposundan uygulama dizinine bağlanmak yerine anlamını tam tersi şekilde yapabilirsiniz.
Örneğin, ~/application
'da kurulu config.conf
yapılandırma dosyasını gerektiren bir uygulama kurduğumu varsayalım:
config.conf
eklerim, örneğin ~/repos/application/config.conf
.~/application
komutunu çalıştırarak ln -s ~/repos/application/config.conf
adresinden bir bağlantı oluşturdum.Bu yaklaşım her zaman işe yaramayabilir, ama şimdiye kadar benim için iyi çalıştı.
Bunun yerine sert bağlantılar kullanın. Bu yumuşak (sembolik) bir bağlantıdan farklıdır. git
dahil tüm programlar, dosyayı normal bir dosya olarak ele alır. İçeriğin, kaynak veya hedef [ değiştirilerek değiştirilebileceğini unutmayın.
Zaten git ve Xcode yüklüyse, install hardlink . Mikroskobik bir sert bağlantılar oluşturma aracı .
Sabit bağlantıyı oluşturmak için, basitçe:
hln source destination
Apple Dosya Sistemi, dizin sabit bağlantılarını destekliyor mu?
Dizin sabit bağlantıları Apple Dosya Sistemi tarafından desteklenmiyor. Tüm dizin sabit bağlantıları, macOS'ta HFS + 'dan APFS birim biçimlerine dönüştürdüğünüzde sembolik bağlantılara veya diğer adlara dönüştürülür.
Gelecekteki alternatifler için https://github.com/selkhateeb/hardlink/issues/31 izleyin.
ln
komutu sert bağlantılar oluşturabilir:
ln source destination
Birisi mklink kullanmak için Windows'ta bir kavşak oluşturmayı önerdi, ancak denemedim:
mklink /j "source" "destination"
Bu, dizindeki sembolik bağları, bu sembollerin içeriği ile değiştiren ön işleme kancasıdır .
Bunu .git/hooks/pre-commit
içine koyun ve yürütülebilir hale getirin:
#!/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
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.
Bir şekilde test edilmesine rağmen, bu kodda bazı hatalar/hatalar olabilir.
Eskiden uzun süre sembolik çizgilerin ötesine dosya eklerdim. Bu, herhangi bir özel düzenleme yapmadan gayet iyi çalışırdı. Git 1.6.1’e güncellediğim için bu artık işe yaramıyor.
Bu işlemi yapmak için Git 1.6.0'a geçebilirsiniz. Umarım, Git'in gelecekteki bir sürümünün tekrar kodlarını takip etmesini sağlayan git-add
için bir bayrağı olacaktır.
Git 2.3.2+ ile (Q1 2015), Git'in değil'in artık bağlantıyı takip edeceği başka bir durum daha var: bakınız taahhüt e0d201b , Junio C Hamano (gitster
) (ana Git kaleci)
apply
: sembolik bir bağın ötesinde bir dosyaya dokunmayınGit sembolik bağları sembolik bağlar olarak izlediğinden, önde gelen kısmında sembolik bir bağ olan bir yol (örn.
path/to/dir/file
,path/to/dir
başka bir yere sembolik bağdır, çalışma ağacının içinde veya dışında) asla bir düzeltme ekinde görünemez. Aynı yama ilk önce bir dizinin orada oluşturulmasına izin vermek için sembolik bağlantıyı kaldırmadıkça geçerlidir.Böyle bir yamayı algıla ve reddet.
Benzer şekilde, bir giriş
path/to/dir
sembolik bir link oluşturduğunda ve ardındanpath/to/dir/file
dosya oluşturduğunda, dosya sisteminde gerçektenpath/to/dir
sembolik link oluşturmadan bunu bir hata olarak işaretlememiz gerekir.Bunun yerine, girişteki sonuçta yol bırakan (yani silinmeyen) herhangi bir yama için, girişteki tüm yamaları ve ardından yamanın hedefini inceleyerek yamanın oluşturacağı tüm ağaca karşı öndeki tüm yolları denetleriz uygulama (dizin veya çalışma ağacı).
Bu şekilde, biz:
- aynı anda sembolik bir link
path/to/dir
ve bir dosyapath/to/dir/file
eklemek için bir yaramazlık veya yanlışlık yakalamak,- sembolik bir
link path/to/dir
dosyasını kaldıran ve ardından birpath/to/dir/file
dosyası ekleyen geçerli bir yamaya izin verirken.
Bu, bu durumda, hata mesajının "%s: patch does not apply"
gibi genel bir mesaj olmayacağı, daha belirgin bir mesaj olduğu anlamına gelir:
affected file '%s' is beyond a symbolic link
Buradaki her çözümden ya modası geçmiş ya da kök gerektiren yoruldum, bu yüzden LD_PRELOAD tabanlı bir çözüm (sadece Linux) yaptım.
Git'in içindekilerine bağlanıyor, 'bu bir bağlantı mı?' işlev, sembolik bağlantıların içerik olarak ele alınmasına izin verir. Varsayılan olarak, deponun dışına olan tüm bağlantılar sıralanır; Ayrıntılar için bağlantıya bakınız.
Hmmm, mount --bind
Darwin'de işe yaramıyor.
Hile yapan var mı?
[Düzenlenmiş]
Tamam, Mac OS X'te cevabı buldum. Bu API ln
yoluyla gösterilmezse, bu yüzden bunu yapmak için kendi küçük programınızı kullanmanız gerekir. İşte bu programın bir link:
Mac OS X'te dizin hard linkleri oluşturma
Keyfini çıkarın!
Git 1.5.4.3 kullanıyorum ve izleyen bir çizgi varsa, geçen bağlantı işaretini takip ediyor. Örneğin.
# Adds the symlink itself
$ git add symlink
# Follows symlink and adds the denoted directory's contents
$ git add symlink/
MacOS
'da bindfs
öğesini kullanın.
brew install bindfs
cd /path/to/git_controlled_dir
mkdir local_copy_dir
bindfs <source_dir> local_copy_dir
Diğer yorumlar tarafından ima edildi, ancak diğer cevaplarda açıkça belirtilmedi. Umarım bu birilerine zaman kazandırır.
Sembol bağlarından dönüşüm yararlı olabilir. Betiği ile _ymlink yerine Git klasörüne bağlanın.