как мне клонировать файлы с двоеточиями в имени файла

#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) — вместо двоеточий отображаются разные символы.