#windows #git #filenames
#Windows #git #имена файлов
Вопрос:
Когда я клонирую репозиторий с помощью msysgit, все файлы с пробелами в имени файла не удаляются, а затем отображаются как удаленные в статусе.
Имена файлов выглядят примерно так: styles-ie (1:12:11 6:02 PM).css
так что на самом деле это может быть двоеточие или скобки?
Как я могу извлечь эти файлы, чтобы мой локальный репозиторий был встроен в источник?
Комментарии:
1. согласно support.microsoft.com/kb/177506 двоеточие является недопустимым символом имени файла в Windows. Значит ли это, что я никогда не смогу клонировать / извлекать файл в систему Windows, или есть какой-то перевод имени файла?
2. Я предлагаю вам изменить имя файла.
3. Точнее, я полагаю, вы не можете извлечь файл. Представляющий его объект (blob) находится в вашем репозитории, и он был передан как часть клонирования или выборки, но когда Git пытается записать этот файл в ваше рабочее дерево, Windows этого не позволяет.
Ответ №1:
Хорошие новости.Технически, ответ на вопрос «как мне клонировать файлы с двоеточиями в имени файла» заключается в простом использовании «git clone». К счастью, сбой происходит только при проверке в Windows (даже в msysgit), и для этого есть довольно простое решение, показанное ниже.
TL; DR
в Git Bash…
git clone {repo URL}
cd {repo dir}
git ls-tree -r master --name-only | grep -v ":" | xargs git reset HEAD
git commit -m "deleting all files with a colon in the name"
git restore .
… и затем
- загрузите ZIP-файл всего репозитория git
- переименовывать файлы с двоеточиями внутри Zip (без их извлечения)
- извлеките только те файлы, которые вы переименовали
- добавьте эти переименованные файлы в свой рабочий каталог
Для ознакомления с несколькими шагами, перечисленными выше, пожалуйста, продолжайте читать….
Я смог обойти эту проблему при работе с репозиторием с двоеточиями в различных именах файлов. У меня сработало следующее:
- Сделайте обычный git clone.
$ git clone https://github.com/wdawson/dropwizard-auth-example.git
Вы должны увидеть следующую ошибку, в которой отмечается, что клонирование прошло успешно, но проверка завершилась неудачно.
Cloning into 'dropwizard-auth-example'...
remote: Enumerating objects: 322, done.
remote: Total 322 (delta 0), reused 0 (delta 0), pack-reused 322
Receiving objects: 100% (322/322), 15.00 MiB | 2.88 MiB/s, done.
Resolving deltas: 100% (72/72), done.
error: invalid path 'src/test/resources/revoker/example-ca/certs/root.localhost:9000.cert.pem'
fatal: unable to checkout working tree
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry with 'git restore --source=HEAD :/'
- Измените каталоги на новое клонированное хранилище
cd dropwizard-auth-example
- Убедитесь, что рабочий каталог git repo полностью пуст
ls
- Запустите git-status, чтобы обнаружить, что все файлы подготовлены к удалению
$ git status
Вывод…
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
deleted: .gitignore
deleted: .travis.yml
deleted: LICENSE
deleted: NOTICE
deleted: README.md
deleted: conf.yml
...
- Отмените поэтапное удаление только файлов, которые не содержат двоеточие в имени файла.
$ git ls-tree -r master --name-only | grep -v ":" | xargs git reset HEAD
Вывод…
Unstaged changes after reset:
D .gitignore
D .travis.yml
D LICENSE
D NOTICE
D README.md
D conf.yml
D java-cacerts.jks
D pom.xml
D src/main/java/wdawson/samples/dropwizard/UserInfoApplication.java
D src/main/java/wdawson/samples/dropwizard/api/UserInfo.java
D src/main/java/wdawson/samples/dropwizard/auth/OAuth2Authenticator.java
D src/main/java/wdawson/samples/dropwizard/auth/OAuth2Authorizer.java
D src/main/java/wdawson/samples/dropwizard/auth/Role.java
...
- Запустите git status еще раз, чтобы увидеть, что только файлы, содержащие двоеточие в имени файла, теперь готовятся к удалению. Все остальные файлы по-прежнему отображаются как удаленные, но не подготовлены для фиксации. Это то, что мы хотим на данном этапе.
$ git status
Вывод…
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
deleted: src/test/resources/revoker/example-ca/certs/root.localhost:9000.cert.pem
deleted: src/test/resources/revoker/example-ca/csr/root.localhost:9000.csr.pem
deleted: src/test/resources/revoker/example-ca/intermediate/certs/intermediate.localhost:9000.cert.pem
deleted: src/test/resources/revoker/example-ca/intermediate/csr/intermediate.localhost:9000.csr.pem
deleted: src/test/resources/revoker/example-ca/intermediate/private/intermediate.localhost:9000.key.pem
deleted: src/test/resources/revoker/example-ca/private/root.localhost:9000.key.pem
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: .gitignore
deleted: .travis.yml
deleted: LICENSE
deleted: NOTICE
deleted: README.md
deleted: conf.yml
deleted: java-cacerts.jks
deleted: pom.xml
- Зафиксируйте все подготовленные файлы. То есть зафиксируйте удаление всех файлов, которые содержат двоеточие в имени файла.
git commit -m "deleting all files with a colon in the name"
- Восстановите все в рабочем каталоге.
$ git restore .
- Просмотрите все файлы. Какой красивый сайт.
$ ls
Вывод…
conf.yml java-cacerts.jks LICENSE NOTICE pom.xml README.md src
Как только вы удалите файлы-нарушители из своего рабочего каталога…
- загрузите ZIP-файл всего репозитория GitHub
- откройте его в 7Zip… Не разархивируйте его… просто откройте его для редактирования (чтобы переименовать файлы)
- найдите файлы, в названии которых есть двоеточие
- переименуйте каждый файл с помощью двоеточия, заменив двоеточие символом подчеркивания … или любым другим подходящим
- теперь вы можете извлечь те файлы, которые вы только что переименовали
- скопируйте их в рабочий каталог git
PS: Все вышесказанное было сделано в GitBash на Windows 10 с использованием git версии 2.25.1.windows.1. Аналогичные шаги можно выполнить через графический интерфейс, используя TortoiseGit в Windows.
Ответ №2:
Если вы попытаетесь выполнить:
touch "styles-ie (1:12:11 6:02 PM).css"
вы увидите, что вы не можете создать его в Windows.
В принципе, в репозитории есть файл (большой двоичный объект и запись в дереве), но вы не можете выполнить проверку в Windows, поскольку git не сможет создать такой файл. Нет другого способа, кроме как изменить имя файла.
Комментарии:
1. спасибо, в частности, пользователю с клоном репозитория в системе, отличной от Windows, необходимо изменить имя файла и нажать, чтобы я мог его извлечь, верно?
2. @Jonathan Day — да, это было бы так.
3. Этот ответ правильный, но если вы хотите найти обходной путь, продолжайте читать — приведенный ниже ответ @RJLyders удивительно полезен.
4. Вы могли бы использовать WSL для этого, ссылка: learn.microsoft.com/en-us/windows/wsl/install-win10
Ответ №3:
Вы можете клонировать репозиторий в среде Linux, настроить его и скопировать в Windows, а затем разархивировать в Windows с помощью таких инструментов, как 7zip. 7zip заменит двоеточие подчеркиванием и сохранит всю информацию git. Пока этот файл не изменится, некоторое время все будет готово. В любом случае, эти файлы, как правило, не сильно меняются (например, у меня есть файл сертификата с двоеточием посередине).
Ответ №4:
В поддержку ответов «с использованием WSL» или «с использованием среды Linux»:
Использование WSL: (Windows 11)
1. Включить виртуализацию:
- в BIOS
- в Windows («Включить или выключить функции Windows» -> «Платформа виртуальной машины» / «Подсистема Windows для Linux» -> проверить)
2. Загрузите и установите дистрибутив Linux (например, Ubuntu — последнюю версию):
-
в PowerShell:
wsl —install -d Ubuntu
3. Клонировать репозиторий в консоли WSL Linux
После установки WSL запустите приложение «WSL» — будет доступна консоль Linux. В этой консоли Linux — клонируйте репозиторий, как вы обычно делаете **.
** В моем случае я вошел в систему как root (> sudo su), создал ssh-ключи, добавил открытый ssh-ключ в репозиторий github, перешел в требуемый каталог и клонировал ssh-репозиторий.
В результате через консоль WSL я могу видеть файлы с «:». Через другие файловые менеджеры, консоли (File Explorer, PowerShell, cmd, git CLI) — вместо двоеточий отображаются разные символы.