Добавить символьный файл как файл, используя 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.