Windows 如何克隆文件名中带有冒号的文件

Windows 如何克隆文件名中带有冒号的文件,windows,git,filenames,Windows,Git,Filenames,当我使用msysgit克隆repo时,文件名中带有空格的所有文件都不会被删除,然后在状态中显示为已删除 文件名看起来像这样:样式ie(1:12:11 6:02 PM).css那么它实际上可能是冒号或括号 我如何获取这些文件以使我的本地回购协议与原始协议保持一致 如果您尝试执行以下操作: touch "styles-ie (1:12:11 6:02 PM).css" 您将看到无法在Windows上创建它 基本上,repo有这个文件(blob和树条目),但是您不能在Windows上签出,因为git

当我使用msysgit克隆repo时,文件名中带有空格的所有文件都不会被删除,然后在状态中显示为已删除

文件名看起来像这样:
样式ie(1:12:11 6:02 PM).css
那么它实际上可能是冒号或括号

我如何获取这些文件以使我的本地回购协议与原始协议保持一致

如果您尝试执行以下操作:

touch "styles-ie (1:12:11 6:02 PM).css"
您将看到无法在Windows上创建它


基本上,repo有这个文件(blob和树条目),但是您不能在Windows上签出,因为git将无法创建这样的文件。除了更改文件名之外,没有其他方法。

您可以在linux环境中克隆repo,将其标记为tar并复制到windows,然后使用诸如的工具在windows上解除标记。7zip将用下划线替换冒号,并保留所有git信息。只要该文件不更改,您将在一段时间内完成所有设置。这些文件通常不会有太大的变化(例如,我有一个中间带冒号的cert文件)

好消息。 从技术上讲,“如何在文件名中使用冒号克隆文件”的答案是简单地使用“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 .
。。。然后

  • 下载整个git repo的Zip文件
  • 在Zip中使用冒号重命名文件(不提取文件)
  • 只提取您重命名的文件
  • 将这些重命名的文件添加到您的工作目录中
要深入了解上面列出的几个步骤,请继续阅读……

我能够解决这个问题,同时使用不同文件名中的冒号进行回购。以下几点对我很有用:

  • 做一个常规的git克隆
$git克隆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 :/'
  • 将目录更改为新克隆的repo
cd-dropwizard身份验证示例

  • 检查git repo工作目录是否完全为空
ls

  • 运行git status以发现所有文件都已暂存以进行删除
$git状态

输出

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
...
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
...
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 status以查看只有文件名中包含冒号的文件现在才被暂存删除。所有其他文件仍显示为已删除,但未暂存以进行提交。这就是我们在现阶段想要的
$git状态

输出

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
...
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
...
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还原--暂存…”取消暂存)
已删除:src/test/resources/revoker/example ca/certs/root.localhost:9000.cert.pem
删除:src/test/resources/revoker/example ca/csr/root.localhost:9000.csr.pem
删除:src/test/resources/revoker/example ca/intermediate/certs/intermediate.localhost:9000.cert.pem
删除:src/test/resources/revoker/example ca/intermediate/csr/intermediate.localhost:9000.csr.pem
删除:src/test/resources/revoker/example ca/intermediate/private/intermediate.localhost:9000.key.pem
删除:src/test/resources/revoker/example ca/private/root.localhost:9000.key.pem
未为提交而暂存的更改:
(使用“git add/rm…”更新将提交的内容)
(使用“git restore…”放弃工作目录中的更改)
已删除:。忽略
已删除:.travis.yml
删除:许可证
删除:通知
已删除:README.md
已删除:conf.yml
已删除:java-cacerts.jks
已删除:pom.xml
  • 提交所有暂存文件。也就是说,提交删除文件名中包含冒号的所有文件
git commit-m“删除名称中带有冒号的所有文件”

  • 恢复工作目录中的所有内容
$git还原。

  • 查看所有文件。多美的地方啊
$ls

输出

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
...
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
...
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
conf.yml java-cacerts.jks许可通知pom.xml README.md src

一旦您从工作目录中删除了有问题的文件

  • 下载整个GitHub repo的压缩包
  • 用7Zip打开它。。。不要解压缩它。。。只需打开它进行编辑(重命名文件)
  • 查找名称中有冒号的文件
  • 用冒号重命名每个文件,用下划线替换冒号…或其他合适的名称
  • 现在,您可以提取刚刚重命名的文件
  • 将它们复制到git工作目录中

PS:以上所有操作都是在GitBash中使用GitVersion2.25.1.Windows.1在Windows10上完成的。类似的步骤可以通过GUI在Windows上使用Ortoisegit完成。

根据冒号,Windows上的文件名字符无效。那么,这是否意味着我永远无法将文件克隆/获取到Windows系统,或者存在文件名转换?我建议您更改文件名。更准确地说,我相信您无法签出该文件。表示它的对象(blob)在您的存储库中,它是作为克隆或获取的一部分传输的,但当Git尝试将该文件写入您的工作树时,Windows不会允许它。谢谢,因此特别是在非Windows系统上具有repo克隆的用户需要更改文件名并推送,以便我可以获取它,是吗?@Jonathan Day-是的,就是这样。这个答案是正确的,但如果你想解决问题,请继续阅读-@RJLyders下面的答案非常有用。你可以使用WSL来完成这个任务,链接:超级棒!但是,如何更改其他分支中的文件名,因为我不能