it-swarm-tr.com

Git'in sembolik bağlantıları takip etmesini nasıl sağlayabilirim?

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.

174
Matt

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.

37
Kent Fredric

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.

124
user252400

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:

  • Git havuzuna config.conf eklerim, örneğin ~/repos/application/config.conf.
  • Sonra ~/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ı.

65
spier

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.

MacOS'ta (10.13 Yüksek Sierra'dan önce)

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

macOS Yüksek Sierra güncellemesi

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.

From developer.Apple.com’da APFS FAQ

Gelecekteki alternatifler için https://github.com/selkhateeb/hardlink/issues/31 izleyin.

Linux ve diğer Unix lezzetlerinde

ln komutu sert bağlantılar oluşturabilir:

ln source destination

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

Birisi mklink kullanmak için Windows'ta bir kavşak oluşturmayı önerdi, ancak denemedim:

mklink /j "source" "destination"
41
bfred.it

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

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.

Bir şekilde test edilmesine rağmen, bu kodda bazı hatalar/hatalar olabilir.

16
Abbafei

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.

12
Erik Schnetter

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ın

Git 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ından path/to/dir/file dosya oluşturduğunda, dosya sisteminde gerçekten path/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 dosya path/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 bir path/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
6
VonC

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.

5
Alcaro

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!

4
J Chris A

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/
1
artistoex

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. 

0
ijoseph

Sembol bağlarından dönüşüm yararlı olabilir. Betiği ile _ymlink yerine Git klasörüne bağlanın.

0
Yurij73