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

Posted

技术标签:

【中文标题】如何克隆文件名中带有冒号的文件【英文标题】:how do I clone files with colons in the filename 【发布时间】:2011-08-24 21:50:13 【问题描述】:

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

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

如何获取这些文件以使我的本地 repo 与源内联?

【问题讨论】:

根据support.microsoft.com/kb/177506,冒号在 Windows 上是无效的文件名字符。那么这是否意味着我永远无法将文件克隆/获取到 Windows 系统,或者是否有一些文件名翻译? 建议你改一下文件名。 更准确地说,我相信您无法签出该文件。代表它的对象(blob)在您的存储库中,它作为克隆或提取的一部分被传输,但是当 Git 尝试将该文件写入您的工作树时,Windows 不会允许它。 【参考方案1】:

如果你尝试这样做:

touch "styles-ie (1:12:11 6:02 PM).css"

你会发现你无法在 Windows 上创建它。

基本上,repo 包含文件(blob 和树条目),但您无法在 Windows 上签出,因为 git 无法创建这样的文件。没有别的办法,只能改文件名。

【讨论】:

谢谢,所以特别是在非 Windows 系统上具有 repo 克隆的用户需要更改文件名并推送,以便我可以获取它,对吗? @Jonathan Day - 是的,就是这样。 这个答案是正确的,但如果您想要解决方法,请继续阅读 - 下面的@RJLyders 答案非常有用。 您可以为此使用 WSL,链接:docs.microsoft.com/en-us/windows/wsl/install-win10【参考方案2】:

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

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

下载整个 GitHub 存储库的 Zip 文件 在 7Zip 中打开它...不要解压缩它...打开它进行编辑(重命名文件) 查找名称中带有冒号的文件 用冒号重命名每个文件,用下划线替换冒号...或任何合适的东西 现在您可以提取刚刚重命名的文件 将它们复制到 git 工作目录中

PS:以上所有操作都是在 Windows 10 上的 GitBash 中使用 git 版本 2.25.1.windows.1 完成的。在 Windows 上使用 TortoiseGit 可以通过 GUI 完成类似的步骤。

【讨论】:

【参考方案3】:

您可以在 linux 环境中克隆 repo,将其 tar 并复制到 windows,然后使用 7zip 等工具在 windows 上解压。 7zip 会将冒号替换为下划线,并保留所有 git 信息。只要该文件没有更改,您就可以准备好一段时间。无论如何,这些文件往往不会有太大变化(例如,我有一个中间有冒号的证书文件)。

【讨论】:

【参考方案4】:

支持“使用 WSL”或“使用 Linux 环境”的答案:

使用 WSL: (Windows 11)

1.启用虚拟化:

在 Bios 中 在 Windows 中(“打开或关闭 Windows 功能”->“虚拟机平台”/“适用于 Linux 的 Windows 子系统”->勾选)

2。下载并安装 linux distibutive(例如 Ubuntu - 最新):

在 PowerShell 中:

wsl --install -d Ubuntu

3.在 WSL linux 控制台中克隆 repo

安装 WSL 后 - 运行应用程序“WSL” - 将会有一个 linux 控制台可用。在那个 linux 控制台中 - 像往常一样克隆存储库**。

** 在我的例子中,我以 root (>sudo su) 身份登录,创建了 ssh 密钥,将公共 ssh 密钥添加到 github 存储库,导航到所需目录并克隆了 ssh 存储库。

因此,通过 WSL 控制台,我可以看到带有“:”的文件。 通过另一个文件管理器、控制台(文件资源管理器、PowerShell、cmd、git CLI)——代替冒号显示不同的符号。

【讨论】:

以上是关于如何克隆文件名中带有冒号的文件的主要内容,如果未能解决你的问题,请参考以下文章

通过 pyspark 加载文件名中包含冒号的 Amazon S3 文件

如何在hibernate和postgresql中读出名称中带有冒号(:)的列

名称中带有冒号的 XElement 不起作用 [重复]

Powershell - 展开存档并重命名文件,因为它包含无效字符

如何在 python 中导入名称中带有空格的文件?

如何从勒索软件中恢复每个文件中带有“[3442516480@qq.com].pdf”的文件