Как я могу заставить git следовать символическим ссылкам?
У меня был google, как это сделать, но не повезло.
будет ли мой лучший сценарий оболочки, который заменяет символические ссылки копиями, или есть другой способ сказать git следовать символическим ссылкам?
PS: Я знаю, что это не очень безопасно, но я хочу сделать это только в нескольких конкретных случаях.
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 destinationmacOS High Sierra update
поддерживает ли файловая система Apple жесткие ссылки на каталоги?
каталог жесткие ссылки не поддерживаются файловой системой Apple. Все жесткие ссылки каталога преобразуются в символьные ссылки или псевдонимы при преобразовании из форматов томов HFS+ в APFS на macOS.
следовать 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