Как заставить GIT обрабатывать соединения каталогов как обычные папки в Windows?

Мне нужно поделиться, чтобы поделиться определенными файлами между различными проектами. Таким образом, у меня есть структура файла, например, так:

D:\shared\
D:\shared\files-shared-by-all-projects-here

D:\project1\
D:\project1\project1-specific-files-here
D:\project1\shared <- directory junction to D:\shared

D:\project2\
D:\project2\project2-specific-files-here
D:\project2\shared <- directory junction to D:\shared

Я установил GIT репо в D:\project1 а также D:\project2 Моя проблема в том, что GIT, похоже, отслеживает файлы только в несопряженных (то есть в реальных каталогах).

Я использую Visual Studio 2015 для обоих проектов, и Team Explorer будет вести себя очень странно, если в проекте есть файлы из "соединенных" каталогов:

  • После добавления файла, находящегося в соединении каталогов, в проект, Team Explorer будет показывать только родительский каталог (соединение) в списке изменений для фиксации, а не сам файл.
  • После внесения всех изменений (т. Е. Файлы были добавлены), Solution Explorer показывает все файлы, которые отслеживаются и возвращаются (включая те, которые находятся в соединениях и не были показаны в списке ожидающих изменений после их добавления):

git1

  • Редактирование файла, который показан как зарегистрированный и находится в каталоге соединений, заставит его казаться извлеченным:

git2

  • Теперь, возвращаясь в Team Explorer, извлеченный файл отображается в списке измененных файлов:

git3

  • Однако попытка зафиксировать его не удалась с сообщением: "Произошла ошибка. Подробное сообщение: без изменений; ничего не зафиксировано".

git4

  • При возврате в обозреватель решений измененный файл, для которого зафиксирован сбой, тем не менее отображается как зарегистрированный:

git5

Явное добавление файлов, которые находятся в общем каталоге (то есть ссылки на него через D:\project2\shared\some-shared-file) из-за пределов Visual Studio использование Tortoise GIT, например, не работает: добавление завершается неудачно с сообщением, что это файл и каталог.

git6 git7

Выше было сделано с новым тестовым проектом, где frame директория, находящаяся в корне проекта, действительно является соединением.

Однако в моих реальных проектах ситуация несколько иная... Если бы я просматривал репозиторий, используя Tortoise GIT, например, он фактически показывал бы общие файлы, находящиеся в местах соединения, как отслеживаемые и проверенные, а также часть репо. Однако, как только я открою проект в Visual Studio, он покажет те же файлы в Solution Explorer и Team Explorer Changes как "ожидающие удаления". Так это странная причуда?

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

1 ответ

Решение

В настоящее время это не поддерживается. Это связано с разницей в интерпретации между обработкой соединений между Git для Windows и libgit2, которая является библиотекой Git, используемой Visual Studio и (частично) TortoiseGit.

Было решено, что обе реализации должны обрабатывать точки соединения, как если бы они были точками монтирования Unix, однако в настоящее время ни одна из реализаций на самом деле не делает этого.

В настоящее время Git для Windows обрабатывает их так, как если бы они были обычными каталогами (и поэтому он может удалить ваше соединение и заменить его новым каталогом). libgit2 рассматривает это как символическую ссылку, и в результате Visual Studio отказывается иметь дело с этим вообще.

Поскольку Microsoft потребуется обновить Visual Studio, чтобы исправить это, пожалуйста, сообщите об ошибке в Microsoft Connect и предложите людям проголосовать за нее в надежде, что она будет исправлена ​​в VS 2015.

Другие вопросы по тегам