Czy najlepiej będzie, gdy będę używać skryptu powłoki, który zastępuje dowiązania symboliczne kopiami, czy też jest inny sposób, aby powiedzieć Gitowi, by podążał za dowiązaniami symbolicznymi?
PS: Wiem, że nie jest to zbyt bezpieczne, ale chcę to zrobić tylko w kilku konkretnych przypadkach.
Odpowiedzi:
UWAGA: Ta rada jest obecnie nieaktualna zgodnie z komentarzem od wersji Git 1.6.1. Git zachowywał się w ten sposób i już tego nie robi.
Git domyślnie próbuje przechowywać dowiązania symboliczne zamiast je śledzić (dla zwięzłości i to jest to, czego ludzie chcą).
Jednak przypadkowo udało mi się go dodać, aby dodać pliki poza dowiązaniem symbolicznym, gdy dowiązanie symboliczne jest katalogiem.
To znaczy:
wykonując
wydawało się, że działa, kiedy próbowałem. Zachowanie to było jednak przeze mnie niepożądane, więc nie mogę przekazać ci informacji poza tym.
źródło
Co zrobiłem, aby dodać pliki z dowiązania symbolicznego do Git (nie użyłem dowiązania symbolicznego, ale):
Wykonaj to polecenie w katalogu zarządzanym przez Git.
TARGETDIRECTORY
musi zostać utworzony przedSOURCEDIRECTORY
zamontowaniem w nim.Działa dobrze w systemie Linux, ale nie w systemie OS X! Ta sztuczka pomogła mi również w Subversion. Używam go do dołączania plików z konta Dropbox, na którym projektant robi swoje rzeczy.
źródło
umount [mydir]
. (+1 za Twoją świetną wskazówkę, @ user252400)Dlaczego nie utworzyć dowiązań symbolicznych na odwrót? Oznacza to, że zamiast łączyć z repozytorium Git do katalogu aplikacji, wystarczy połączyć na odwrót.
Załóżmy na przykład, że konfiguruję zainstalowaną aplikację,
~/application
która potrzebuje pliku konfiguracyjnegoconfig.conf
:config.conf
do mojego repozytorium Git, na przykład o~/repos/application/config.conf
.~/application
, uruchamiającln -s ~/repos/application/config.conf
.To podejście może nie zawsze działać, ale jak dotąd działało dobrze.
źródło
Zamiast tego użyj twardych linków. Różni się to od miękkiego (symbolicznego) łącza. Wszystkie programy, w tym również
git
będą traktować plik jako zwykły plik. Należy pamiętać, że zawartość może być modyfikowana poprzez zmianę albo źródła lub przeznaczenia.Na macOS (wcześniej niż 10.13 High Sierra)
Jeśli masz już zainstalowane git i Xcode, zainstaluj hardlink . To mikroskopijne narzędzie do tworzenia twardych łączy .
Aby utworzyć twardy link, po prostu:
Aktualizacja systemu macOS High Sierra
Śledź https://github.com/selkhateeb/hardlink/issues/31, aby znaleźć przyszłe alternatywy.
W systemie Linux i innych wersjach Uniksa
ln
Polecenie może zrobić dowiązania twarde:W systemie Windows (Vista, 7, 8,…)
Ktoś zasugerował, aby użyć mklink utworzyć połączenie w systemie Windows, ale nie próbowałem:
źródło
ln source destination
działa również w OS X. Testowane na El Capitan.cp -al source destination
. `-l 'oznacza twarde łącza zamiast kopiowania.Jest to haczyk poprzedzający zatwierdzenie, który zastępuje obiekty BLOB symboliczne w indeksie zawartością tych dowiązań symbolicznych.
Włóż to
.git/hooks/pre-commit
i zrób to:Notatki
Używamy w jak największym stopniu funkcjonalności zgodnej z POSIX; jednak
diff -a
nie jest zgodny z POSIX, być może między innymi.W tym kodzie mogą występować błędy / błędy, mimo że został on nieco przetestowany.
źródło
typechange
wgit status
przypadku plików, które w rzeczywistości są dowiązaniami symbolicznymi, chociaż teraz nie są nimi.process_links_to_nondir
?argv[0]
która jest używana jako nazwa polecenia dlash
procesu. (Trochę mnie to rozgryzło, bo też nie pamiętam, co to było ☺😃)find: missing argument to -exec'
. Może być konieczne wykonanie polecenia krok po kroku zamiast pipowania i łączenia wszystkiego w jedną linię.typechange
podobny @DavidFraser, ale połączony plik wydaje się już nie być wystawiany)Włącz
MacOS
(mam Mojave / 10.14,git
wersja 2.7.1), użyjbindfs
.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>
Wskazały na to inne komentarze, ale nie zostały jasno podane w innych odpowiedziach. Mam nadzieję, że zaoszczędzi to komuś trochę czasu.
źródło
Failed to resolve
...No such file or directory
błędów chyba użyłem pełnych nazw ścieżek zbindfs
poleceniem.Od dłuższego czasu dodawałem pliki poza dowiązaniami symbolicznymi. Kiedyś działało dobrze, bez żadnych specjalnych ustaleń. Ponieważ zaktualizowałem do wersji Git 1.6.1, to już nie działa.
Możesz być w stanie przełączyć się na Git 1.6.0, aby to zadziałało. Mam nadzieję, że przyszła wersja Gita będzie miała flagę
git-add
pozwalającą mu ponownie podążać za dowiązaniami symbolicznymi.źródło
Zmęczyło mnie każde rozwiązanie, które jest przestarzałe lub wymaga rootowania, więc stworzyłem rozwiązanie oparte na LD_PRELOAD (tylko Linux).
Wchodzi w wewnętrzne elementy Gita, zastępując „czy to dowiązanie symboliczne?” funkcja, umożliwiająca traktowanie dowiązań symbolicznych jako ich zawartości. Domyślnie wszystkie linki do zewnętrznych repozytoriów są wstawiane; zobacz link, aby uzyskać szczegółowe informacje.
źródło
LD_PRELOAD
zastępujące funkcje biblioteczne!W przypadku Git 2.3.2+ (I kwartał 2015 r.) Istnieje jeszcze jeden przypadek, w którym Git nie będzie już podążał za dowiązaniem symbolicznym: patrz commit e0d201b przez Junio C Hamano (
gitster
) (główny opiekun Git)apply
: nie dotykaj pliku poza dowiązaniem symbolicznymOznacza to, że w takim przypadku komunikat o błędzie nie będzie ogólny
"%s: patch does not apply"
, ale bardziej szczegółowy:źródło
Hmmm,
mount --bind
nie działa na Darwina.Czy ktoś ma taką sztuczkę?
[edytowany]
OK, znalazłem odpowiedź na Mac OS X, aby utworzyć hardlink. Tyle że ten interfejs API nie jest
ln
udostępniany przez , więc musisz użyć własnego małego programu, aby to zrobić. Oto link do tego programu:Tworzenie twardych linków do katalogów w Mac OS X.
Cieszyć się!
źródło
Korzystam z Git 1.5.4.3 i podąża za przekazanym dowiązaniem symbolicznym, jeśli ma ukośnik końcowy. Na przykład
źródło
fatal: 'src/' is beyond a symbolic link
Konwersja z dowiązań symbolicznych może być przydatna. Łącze w folderze Git zamiast dowiązania symbolicznego za pomocą skryptu .
źródło