好消息。
从技术上讲,“如何克隆文件名中带有冒号的文件”的答案是简单地使用“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 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
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
一旦你从你的工作目录中删除了有问题的文件......
- 下载整个 GitHub 存储库的 Zip 文件
- 在 7Zip 中打开它...不要解压缩它...打开它进行编辑(重命名文件)
- 查找名称中带有冒号的文件
- 用冒号重命名每个文件,用下划线替换冒号...或任何合适的东西
- 现在您可以提取刚刚重命名的文件
- 将它们复制到 git 工作目录中
PS:以上所有操作都是在 Windows 10 上的 GitBash 中使用 git 版本 2.25.1.windows.1 完成的。在 Windows 上使用 TortoiseGit 可以通过 GUI 完成类似的步骤。