Как я могу заставить git следовать символическим ссылкам?



У меня был google, как это сделать, но не повезло.



будет ли мой лучший сценарий оболочки, который заменяет символические ссылки копиями, или есть другой способ сказать git следовать символическим ссылкам?



PS: Я знаю, что это не очень безопасно, но я хочу сделать это только в нескольких конкретных случаях.

1045   11  

11 ответов:

Примечание: этот совет теперь устарел в соответствии с комментарием, так как git 1.6.1. ГИТ привык вести себя так, и больше не делает.


Git по умолчанию пытается хранить символические ссылки вместо того, чтобы следовать за ними ( для компактности, и это, как правило, то, что люди хотят )

однако мне случайно удалось заставить его добавить файлы за символическую ссылку, когда символическая ссылка является каталогом.

т. е.:

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

делая

 git add /bar/foo/baz

он, казалось, работал, когда я попробовал его, что поведение было, однако, нежелательно для меня в то время, так что я не могу дать вам информацию за пределами этого.

что я сделал, чтобы добавить, чтобы получить файлы в символической ссылке в git (я не использовал символическую ссылку, но):

sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

выполните эту команду в управляемом каталоге git. TARGETDIRECTORY должен быть создан до SOURCEDIRECTORY устанавливается в него.

отлично работает на Linux, но не на OS X! этот трюк помог мне и с подрывной деятельностью. Я использую его для включения файлов из учетной записи Dropbox, где веб-дизайнер делает свои вещи.

почему бы не создать символические ссылки наоборот? Это означает, что вместо связывания из репозитория git с каталогом приложений просто свяжите другой путь.

например, допустим, я настраиваю приложение, установленное в ~/application для этого нужен конфигурационный файл config.conf

  • добавить config.conf в мой репозиторий git, например, в ~/repos/application/config.conf
  • затем я создаю символическую ссылку из ~/application под управлением ln -s ~/repos/application/config.conf

этот подход может не всегда работать, но он работал хорошо для меня до сих пор.

вместо этого используйте жесткие ссылки. Это отличается от мягкой (символической) ссылки. Все программы, включая git будет рассматривать файл как обычный файл. Обратите внимание, что содержимое может быть изменено путем изменения или источник или пункт назначения.

на macOS (до 10.13 High Sierra)

если у вас уже установлены git и Xcode, установить hardlink. Это микроскопический инструмент для создания жестких ссылок.

создать жесткая ссылка, просто:

hln source destination

macOS High Sierra update

поддерживает ли файловая система Apple жесткие ссылки на каталоги?

каталог жесткие ссылки не поддерживаются файловой системой Apple. Все жесткие ссылки каталога преобразуются в символьные ссылки или псевдонимы при преобразовании из форматов томов HFS+ в APFS на macOS.

С APFS FAQ on developer.apple.com

следовать https://github.com/selkhateeb/hardlink/issues/31 для будущих альтернатив.

в Linux и других Unix

The ln команда может сделать жесткие ссылки:

ln source destination

На Windows (Vista, 7, 8, ...)

кто-то предложил использовать mklink создать соединение на Windows, но я еще не пробовал:

mklink /j "source" "destination"

Это pre-commit hook который заменяет символы blobs в индексе, с содержанием этих символических ссылок.

поставить это в .git/hooks/pre-commit, и сделать его исполняемым:

#!/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 ""; diff -au /dev/null "" | git apply --cached -p1 -' \
# ...and call out to "sh".
    "process_links_to_nondir" {} ';'

# the end

Примечания

мы максимально используем функциональность, совместимую с POSIX; однако,diff -a не соответствует POSIX, возможно, среди прочего.

в этом коде могут быть некоторые ошибки/ошибки, даже если он был протестирован несколько.

Я использовал, чтобы добавить файлы за символическими ссылками в течение довольно долгого времени. Раньше это работало просто отлично, без каких-либо особых договоренностей. Поскольку я обновился до git 1.6.1, это больше не работает.

вы можете переключиться на git 1.6.0, чтобы сделать эту работу. Я надеюсь, что в будущей версии git будет флаг для git-add, позволяющий ему снова следовать символическим ссылкам.

С Git 2.3.2+ (Q1 2015), Есть еще один случай, когда Git будет не следуйте символической ссылке Больше: см. commit e0d201b by Junio C Hamano (gitster) (главный сопровождающий Git)

apply: Не прикасайтесь к файлу за символической ссылкой

потому что Git отслеживает символические ссылки как символические ссылки, путь, который имеет символическую ссылку в своей ведущей части (например,path/to/dir/file, где path/to/dir является символической ссылкой на где-то еще, будь то внутри или вне рабочего дерева) никогда не может появиться в патче, который действительно применяется, если тот же патч сначала не удаляет символическую ссылку, чтобы разрешить создание каталога там.

обнаружить и отклонить такой патч.

аналогично, когда вход создает символическую ссылку path/to/dir а затем создает файл path/to/dir/file, нам нужно пометить его как ошибку, фактически не создавая path/to/dir символические ссылки в файловой системе.

вместо этого для любого патча во входных данных, который оставляет путь (т. е. не удаление) в результате, мы проверяем все ведущие пути против результирующего дерева, которое патч создаст, проверяя все патчи во входных данных, а затем цель приложения патча (либо индекс, либо рабочее дерево).

таким образом, мы:

  • поймайте озорство или ошибку, чтобы добавить символическую ссылку path/to/dir и в то же время,
  • в то время как допустимый патч, который удаляет символический link path/to/dir а затем добавляет файл path/to/dir/file.

это означает, что в этом случае, сообщение об ошибке не будет универсального типа "%s: patch does not apply", но более конкретный:

affected file '%s' is beyond a symbolic link

hmmm mount --bind, похоже, не работает на Дарвине.

есть ли у кого-нибудь трюк, который делает?

[отредактировано]

ОК, я нашел ответ на OSX, чтобы сделать жесткую связь. За исключением того, что этот API не отображается через ln Так что вы должны использовать свою собственную крошечную программу, чтобы сделать это. Вот ссылка на эту программу:

создание жестких ссылок каталога в MacOS X?

наслаждайтесь!

Я устал от того, что каждое решение здесь либо устарело, либо требует root, поэтому Я сделал решение на основе LD_PRELOAD.

Я использую git 1.5.4.3, и он следует за переданной символической ссылкой, если она имеет косую черту. Е. Г.

# adds the symlink itself 
$ git add symlink 

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

преобразование из символических ссылок было бы полезно? ссылка в папке git вместо символической ссылки, купить скрипт

Comments

    Ничего не найдено.