Как изменить SYMLINK на SYMLINKD в пакетном скрипте - PullRequest
0 голосов
/ 27 апреля 2018

Мы делимся файлами SYMLINKD в нашем git-проекте. Это почти работает, за исключением того, что git изменяет наши файлы SYMLINKD на файлы SYMLINK при извлечении на другом компьютере.

Для ясности, на исходном компьютере символическая ссылка создается с помощью команды:

mklink /D Annotations ..\..\submodules\Annotations\Assets

На оригинальной машине dir cmd отображает:

25/04/2018  09:52    <SYMLINKD>     Annotations [..\..\submodules\Annotations\Assets]

После клонирования на принимающей машине получаем

27/04/2018  10:52    <SYMLINK>      Annotations [..\..\submodules\Annotations\Assets]

Как вы можете догадаться, file тип цели, указывающий на каталог [.... \ submodules \ Annotations \ Assets] работает неправильно.

Чтобы решить эту проблему, нам нужно:

  1. Запретить git изменять наши типы символических ссылок.
  2. Исправьте наши символические ссылки с помощью пакетного скрипта, запущенного на крючке

Мы идем, мы 2, так как мы не хотим требовать от всех пользователей использовать модифицированную версию git.

Мои ограниченные знания в области пакетных сценариев мешают мне. До сих пор я изучал просто изменение атрибута файла, используя информацию здесь: Как получить атрибуты файла, используя пакетный файл и https://superuser.com/questions/653951/how-to-remove-read-only-attribute-recursively-on-windows-7.

Кто-нибудь может подсказать, какие команды attrib мне нужны для изменения символической ссылки?

Кроме того, я понимаю, что могу удалить и заново создать символическую ссылку, но как получить целевой каталог для существующей символической ссылки, если не использовать команду dir и анализировать путь из выходных данных?

1 Ответ

0 голосов
/ 27 апреля 2018

Я думаю, что это https://github.com/git-for-windows/git/issues/1646.

Чтобы быть более ясным: ваш вопрос, кажется, является проявлением проблемы XY : экземпляр Git, используемый для клонирования / извлечения проекта, кажется, неправильно обрабатывает символические ссылки на каталоги - создавая символические ссылки, указывающие на файлы вместо. Так что, похоже, это ошибка в GfW, поэтому вместо того, чтобы ее выкопать, вы придумали обходной путь и спросили, как заставить его работать.

Итак, я бы лучше попытался помочь сопровождающему GfW и тому, кто сообщит # 1646, решить проблему. Если вам нужно решение с временным интервалом, я бы сказал, что правильным способом было бы пойти другим путем и написать несколько вызовов для git ls-tree, чтобы выяснить, что такое символические ссылки каталога (у них будет специальный набор битов разрешения; Вы можете начать здесь ).

Таким образом, вы будете проходить все объекты дерева коммита HEAD рекурсивно, выяснить, что символические ссылки, указывающие на каталоги, а затем исправьте соответствующие записи в рабочем дереве, удалив их и воссоздание с mklink /D или чем-то еще создает правильный вид символическая.

К сожалению, я боюсь пытаться написать это с использованием возможностей lame из cmd.exe -s сценариев было бы бесполезным упражнением. Я бы взял более «настоящий» язык программирования (например, PowerShell, и - поскольку вы, вероятно, магазин Windows, - даже .NET будет в порядке).

...