it-swarm-eu.dev

Jak mohu získat Git, aby následoval symbolické odkazy?

Je moje nejlepší být Shell skript, který nahrazuje symlinks s kopiemi, nebo je tam jiný způsob, jak říct Git následovat symlinks?

PS: Vím, že to není moc bezpečné, ale chci to udělat jen v několika konkrétních případech.

174
Matt

POZNÁMKA: Tato rada je nyní zastaralá podle komentáře od Git 1.6.1. Git se takto choval a už ne.


Git standardně pokusí ukládat symbolické odkazy namísto jejich následování (pro kompaktnost a obecně to, co lidé chtějí).

Nicméně, omylem se mi podařilo dostat jej k přidání souborů mimo symbolický odkaz, když symbolický odkaz je adresář.

Tj.:

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

tím, že dělá

 git add /bar/foo/baz

zdálo se, že to funguje, když jsem to zkusil. Toto chování mě však v té době nechtělo, takže vám nemohu poskytnout informace mimo to.

37
Kent Fredric

Co jsem přidal, abych získal soubory v rámci odkazu do Gitu (nepoužíval jsem symlink, ale):

Sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

Tento příkaz proveďte v adresáři Git-managed. TARGETDIRECTORY musí být vytvořeno před připojením SOURCEDIRECTORY.

Funguje to dobře na Linuxu, ale ne na OS X! Ten trik mi také pomohl s Subversion. Používám ho k tomu, aby zahrnoval soubory z účtu Dropbox, kde webdesigner dělá své věci.

124
user252400

Proč nevytvářet symbolické odkazy jinak? Znamená to namísto propojení z úložiště Git do adresáře aplikace, stačí odkazovat jinak.

Řekněme například, že nastavuji aplikaci nainstalovanou v souboru ~/application, který potřebuje konfigurační soubor config.conf:

  • Přidám config.conf do mého úložiště Git, například v souboru ~/repos/application/config.conf.
  • Pak vytvořím symbolický odkaz z ~/application spuštěním ln -s ~/repos/application/config.conf.

Tento přístup nemusí vždy fungovat, ale doposud to fungovalo dobře.

65
spier

Toto je pre-commit hák který nahrazuje symbolické blob v indexu, s obsahem těchto symbolických odkazů.

Dejte to do .git/hooks/pre-commit a proveďte jej:

#!/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

Poznámky

Funkci vyhovující POSIX používáme co nejvíce; diff -a však není kompatibilní s POSIX, možná mimo jiné.

V tomto kódu mohou být chyby/chyby, i když byl testován poněkud.

16
Abbafei

Už nějakou dobu jsem přidával soubory mimo symbolické odkazy. Tohle fungovalo v pořádku, bez zvláštních opatření. Vzhledem k tomu, že jsem aktualizoval na Git 1.6.1, to už nefunguje.

Můžete být schopni přepnout na Git 1.6.0, abyste tuto práci provedli. Doufám, že budoucí verze Gitu bude mít příznak git-add, který mu umožní znovu sledovat symbolické odkazy.

12
Erik Schnetter

S Git 2.3.2+ (Q1 2015) existuje ještě jeden případ, kdy Git will not následuje symbolický odkaz: viz commit e0d201b by Junio ​​C Hamano (gitster) (hlavní správce Git) )

apply: nedotýkejte se souboru nad symbolický odkaz

Protože Git sleduje symbolické odkazy jako symbolické odkazy, cesta, která má symbolický odkaz v jeho vedoucí části (např. path/to/dir/file, kde path/to/dir je symbolický odkaz k jinému místu, ať je to uvnitř nebo mimo pracovní strom), se v záplatě nikdy neobjeví. platí, pokud stejná náplast nejprve neodstraní symbolický odkaz, aby tam mohl být vytvořen adresář.

Zjistit a odmítnout takovou náplast.

Podobně, když vstup vytvoří symbolický odkaz path/to/dir a pak vytvoří soubor path/to/dir/file, musíme jej označit jako chybu, aniž bychom ve souborovém systému skutečně vytvořili symbolický odkaz path/to/dir.

Místo toho, pro všechny záplaty ve vstupu, který opustí cestu (tj. Neodstranění) ve výsledku, zkontrolujeme všechny vedoucí cesty proti výslednému stromu, který by záplata vytvořila, kontrolou všech záplat ve vstupu a potom cílem opravy. aplikace (buď index nebo pracovní strom).

Tímto způsobem:

  • chytit chybu nebo chybu přidat symbolický odkaz path/to/dir a soubor path/to/dir/file najednou, 
  • zatímco umožňuje platnou opravu, která odstraní symbolické link path/to/dir a poté přidá soubor path/to/dir/file.

To znamená, že v takovém případě nebude chybové hlášení generické, jako je "%s: patch does not apply", ale konkrétnější:

affected file '%s' is beyond a symbolic link
6
VonC

Byl jsem unavený z každého řešení, ať už zastaralého nebo vyžadujícího root, takže Udělal jsem řešení založené na LD_PRELOAD (pouze Linux).

Zapadá do Gitových vnitřků, převyšuje "je to symlink?" funkce, která umožňuje, aby se k symlinkům přistupovalo jako k jejich obsahu. Ve výchozím nastavení jsou všechny odkazy mimo repo vloženy; Podrobnosti naleznete v odkazu.

5
Alcaro

Hmmm, mount --bind zřejmě nefunguje na Darwinovi.

Má někdo nějaký trik?

[editováno]

OK, našel jsem odpověď na Mac OS X je udělat hardlink. Kromě toho, že API není vystaveno prostřednictvím ln, takže k tomu musíte použít svůj vlastní malý program. Zde je odkaz na tento program:

Vytváření odkazů na adresáře v systému Mac OS X

Užívat si!

4
J Chris A

Používám Git 1.5.4.3 a po překonaném symbolickém odkazu následuje lomítko. Např.

# Adds the symlink itself
$ git add symlink

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

Na MacOS použijte bindfs

brew install bindfs

cd /path/to/git_controlled_dir 

mkdir local_copy_dir

bindfs <source_dir> local_copy_dir

To bylo naznačeno jinými komentáři, ale není jasně uvedeno v jiných odpovědích. Doufejme, že to někomu ušetří čas. 

0
ijoseph

Konverze ze symbolických odkazů by mohla být užitečná. Odkaz ve složce Git namísto symbolického odkazu skriptem .

0
Yurij73