Добавить символьный файл как файл, используя Git на Windows

У меня есть большой (более 1000 файлов) проект VS С# в git. Мне нужно создать небольшой демонстрационный проект и использовать десять файлов из большого проекта. Чтобы создать этот новый проект, я добавил десять файлов с mklink (symlink) из большого проекта в маленький. Все изменения в соответствующих файлах в большом и малом проекте идентичны. Теперь мне нужно добавить небольшой проект в другой (мой) репозиторий git.

Но символическая ссылка не добавит в git:

(ошибка: readlink ("X.cs"): функция не реализована)

Как добавить файл X.cs (символическая ссылка) в git как обычный файл?

Мне нужно, чтобы все изменения в X.cs (в большом проекте) были перенесены в X.cs (в небольшом проекте).

Ответ 1

git имеет проблемы с отдельными ссылками на файлы, но у него нет проблем с символическими ссылками каталога (mklink/d). Поэтому переместите файлы изображений в другой каталог в своем большом проекте и создайте ссылку каталога в репозитории git в этот каталог.

См. ниже, например.

P:\denemeler\gitdeneme1 > mklink/d linkDirectory P:\puzzles

Создана символическая ссылка: linkDirectory < < === → P:\puzzles

P:\denemeler\gitdeneme1 > git статус На сервере ветки Неотслеживаемые файлы:
(используйте "git добавить..." для включения в то, что будет сделано)

    linkDirectory/

ничего не добавлено для фиксации, но нет следов файлов (используйте "git add" to дорожка)

P:\denemeler\gitdeneme1 > git добавить ссылкуDirectory

P:\denemeler\gitdeneme1 > git статус

В главном ветки Изменения должны быть commit: (используйте "git reset HEAD..." для неустановления)

    new file:   linkDirectory/Juggle Fest Question.txt
    new file:   linkDirectory/jugglefest.txt
    new file:   linkDirectory/triangle.txt
    new file:   linkDirectory/triangleQuestion.txt

P:\denemeler\gitdeneme1 > git commit -m "новые файлы"

[мастер 0c7d126] новый файлы изменено 4 файла, 14150 вставок (+) режим создания 100644 linkDirectory/Juggle Fest Режим создания файла Question.txt 100644 linkDirectory/jugglefest.txt режим создания 100644 linkDirectory/triangle.txt режим создания 100644 linkDirectory/triangleQuestion.txt

P:\denemeler\gitdeneme1 > echo "aa" > p:\puzzles\newFile.txt

P:\denemeler\gitdeneme1 > git статус

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

    linkDirectory/newFile.txt

ничего не добавлено для фиксации, но нет следов файлов (используйте "git add" to дорожка)

Ответ 2

Если при добавлении символических ссылок в индекс происходит ошибка с error: readlink("..."): Function not implemented, попробуйте найти эту строку в локальной или глобальной конфигурации:

[core]
    symlinks = false

Вам нужно установить symlinks = true для успешного нажатия. Значение по умолчанию (= true), если параметр не существует или работает неправильно и зависит от настроек, с которыми был создан репозиторий.

Жесткие ссылки не работают с GIT, так как файл и жесткая ссылка хранятся как отдельные файлы.

Он работает так же с git версии 2.8 или выше (я не проверял версии ниже 2.8)

Ответ 3

Текущий ответ устарел и требует пересмотра с учетом последних изменений.
Выданных там решений недостаточно и не работает.

По-прежнему сохраняются проблемы с последним Git 2.12 в Windows (февраль 2017, через 18 месяцев после вопроса OP)

В контексте работы над тем, что было названо git-new-workdir в 2015 году (способность, сформировать один клон, иметь несколько рабочих деревьев: это получилось называемое git worktree) разработчики Git спрашивали, как ссылаться на эти рабочие деревья из основного клонированного репо.
Будут ли они использовать ln? или его эквивалент Windows mklink?

Этот поток в то время выделил проблемы:

При работе в Windows в MinGW создание символических ссылок через ln всегда сбой.
  Использование mklink вместо ln - рекомендуемый метод создания ссылок в Windows

Это может быть правдой, но не идеальной: "Git Bash Shell не создает символические ссылки" упоминает:

Для моей установки, то есть Git для Windows 2.11.0, установленной в Windows 8.1 export MSYS=winsymlinks:nativestrict, используется трюк, как описано здесь: git -for-windows/pull/156

Важно запустить оболочку Git Bash как администратор, так как на Windows только администраторы могут создавать символические ссылки. Итак, чтобы сделать tar -xf работать и создавать необходимые символические ссылки:

  • Запустите Git Bash оболочку как администратор
  • Запустить export MSYS=winsymlinks:nativestrict
  • Запустить tar

См. также "Git Symlinks в Windows", где теперь настройка (Git для Windows 2.10+) включает поддержку символической ссылки:

symlink supoprt

Вам нужно указать, что во время клонирования:

git clone -c core.symlinks=true <URL> 

И ваш сеанс CMD должен запускаться как admin.

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

Тем не менее PR 156 представляет некоторую поддержку Windows для символической ссылки, выпущен в Git для Windows 2.10 (сентябрь 2016).


Говорят, что git worktree завершил реализацию множественной ссылки на рабочий дерево... не полагаясь на символические ссылки и делая заемщики и заемщики знают друг о друге.

Когда вы закончите со связанным рабочим деревом, вы можете просто удалить его. Административные файлы рабочего дерева в репозитории в конечном итоге будут удалены автоматически (см. Gc.pruneworktreesexpire в Git config), или вы можете запустить черновик рабочей среды w20 в главном или любом связанном рабочем дереве, чтобы очистить любые устаревшие файлы администрирования.

Так что никакой символической ссылки нет.

Ответ 4

Git действительно имеет проблемы с символическими ссылками в Windows. Однако, я не думаю, что вам даже нужны символические ссылки на вашу проблему. Простым обходным решением является запись небольшого *.bat script для копирования соответствующих файлов из одного репозитория в другой по требованию. При использовании символической ссылки вам не нужно запускать script, что экономит вам несколько секунд, но у вас возникнет проблема с тем, что вы можете случайно изменить файл в небольшом репозитории и внести нежелательные изменения в большой репозиторий.

Ответ 5

Похоже, что все ваши симлинки расположены в одном разделе ntfs, если это правда, вы можете обновить все симлинки к жестким ссылкам, с помощью некоторых script с командой mklink/h... Hardlinks подходит для любых CVS.