Лучше всего будет сценарий оболочки, который заменяет символические ссылки на копии, или есть другой способ заставить Git следовать символическим ссылкам?
PS: я знаю, что это не очень безопасно, но я хочу сделать это только в нескольких конкретных случаях.
Ответы:
ПРИМЕЧАНИЕ: этот совет устарел согласно комментарию со времен Git 1.6.1. Git обычно так себя ведет и больше не делает.
Git по умолчанию пытается хранить символические ссылки вместо того, чтобы следовать за ними (для компактности, и это обычно то, что люди хотят).
Однако мне случайно удалось заставить его добавлять файлы за пределы символьной ссылки, когда символическая ссылка является каталогом.
То есть:
при выполнении
оказалось, что работает, когда я попробовал. Это поведение, однако, было нежелательным для меня в то время, поэтому я не могу дать вам информацию, кроме этого.
источник
Что я сделал, чтобы добавить файлы внутри символической ссылки в Git (я не использовал символическую ссылку, но):
Выполните эту команду в каталоге, управляемом Git.
TARGETDIRECTORY
должен быть создан до того,SOURCEDIRECTORY
как в него вмонтирован.Он отлично работает на Linux, но не на OS X! Этот трюк помог мне и с Subversion. Я использую его для включения файлов из учетной записи Dropbox, где веб-дизайнер делает свое дело.
источник
umount [mydir]
. (+1 за отличный совет, @ user252400)Почему бы не создать символические ссылки наоборот? То есть вместо того, чтобы ссылаться из репозитория Git на каталог приложения, просто сделайте ссылку наоборот.
Например, допустим, я устанавливаю приложение, в
~/application
котором требуется файл конфигурацииconfig.conf
:config.conf
в свой репозиторий Git, например, at~/repos/application/config.conf
.~/application
, запустивln -s ~/repos/application/config.conf
.Этот подход может не всегда работать, но он до сих пор работал хорошо для меня.
источник
Вместо этого используйте жесткие ссылки. Это отличается от мягкой (символической) ссылки. Все программы, в том числе
git
будут обрабатывать файл как обычный файл. Обратите внимание , что содержимое может быть изменена путем изменения либо источника или назначения.В macOS (до 10.13 High Sierra)
Если у вас уже установлены git и Xcode, установите hardlink . Это микроскопический инструмент для создания жестких ссылок .
Чтобы создать жесткую ссылку, просто:
Обновление macOS High Sierra
Следуйте https://github.com/selkhateeb/hardlink/issues/31 для будущих альтернатив.
В Linux и других разновидностях Unix
Команда
ln
может создавать жесткие ссылки:В Windows (Vista, 7, 8,…)
Кто-то предложил использовать mklink для создания соединения в Windows, но я не пробовал:
источник
ln source destination
работает в OS X тоже. Проверено на El Capitan.cp -al source destination
. `-l 'означает жесткие ссылки на файлы вместо копирования.Это хук перед фиксацией, который заменяет двоичные объекты символьных ссылок в индексе содержимым этих символических ссылок.
Вставьте это
.git/hooks/pre-commit
и сделайте его исполняемым:Ноты
Мы максимально используем POSIX-совместимую функциональность; тем не менее,
diff -a
не совместим с POSIX, возможно, среди прочего.В этом коде могут быть некоторые ошибки / ошибки, даже если он был несколько протестирован.
источник
typechange
вgit status
течение файлов , которые на самом деле символические ссылки , хотя мерзавец теперь все они не являются.process_links_to_nondir
?argv[0]
которое используется в качестве имени команды дляsh
процесса. (Понадобилось немного, чтобы понять это, поскольку я тоже не помню, что это было ☺😃)find: missing argument to -exec'
. Может быть пошаговое выполнение команды, а не сборка и объединение всего в одну строку.typechange
должным образом (я получаю как @DavidFraser, но связанный файл, похоже, больше не ставится)Вкл
MacOS
(у меня Mojave / 10.14,git
версия 2.7.1), используйтеbindfs
.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>
На это намекали другие комментарии, но в других ответах это явно не указано. Надеюсь, это сэкономит кому-то время.
источник
Failed to resolve
...No such file or directory
ошибки, если я не использовал полные пути сbindfs
командой.Я использовал для добавления файлов за символические ссылки в течение достаточно долгого времени. Раньше это работало просто отлично, без каких-либо специальных мер. Поскольку я обновился до Git 1.6.1, это больше не работает.
Вы можете переключиться на Git 1.6.0, чтобы это работало. Я надеюсь, что в будущей версии Git будет флаг,
git-add
позволяющий ему снова следовать символическим ссылкам.источник
Я устал от того, что каждое решение здесь устарело или требует root, поэтому я создал решение на основе LD_PRELOAD (только для Linux).
Он подключается к внутренностям Git, переопределяя «это символическая ссылка?» функция, позволяющая обрабатывать символические ссылки как их содержимое. По умолчанию все ссылки на внешние репо являются встроенными; см. ссылку для деталей.
источник
LD_PRELOAD
для переопределения библиотечных функций!В Git 2.3.2+ (первый квартал 2015 года) есть еще один случай, когда Git больше не будет следовать символической ссылке : см. Commit e0d201b от Junio C Hamano (
gitster
) (главный сопровождающий Git)apply
: не трогать файл за символической ссылкойЭто означает, что в этом случае сообщение об ошибке будет не общим
"%s: patch does not apply"
, а более конкретным:источник
Хммм,
mount --bind
похоже, не работает на Дарвина.У кого-нибудь есть трюк, который делает?
[Отредактированный]
Хорошо, я нашел ответ на Mac OS X, чтобы сделать жесткую ссылку. За исключением того, что этот API не предоставляется через
ln
, поэтому вы должны использовать свою собственную крошечную программу для этого. Вот ссылка на эту программу:Создание каталогов жестких ссылок в Mac OS X
Наслаждайтесь!
источник
Я использую Git 1.5.4.3, и он следует переданной символической ссылке, если он имеет косую черту. Например
источник
fatal: 'src/' is beyond a symbolic link
Преобразование из символических ссылок может быть полезным. Ссылка в папке Git вместо символической ссылки скриптом .
источник