繁体   English   中英

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

[英]how do I clone files with colons in the filename

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

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

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

如果你尝试这样做:

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

你会看到你不能在 Windows 上创建它。

基本上,repo 具有文件( blob 和树条目),但您无法在 Windows 上结帐,因为 git 将无法创建这样的文件。 没有其他办法,只能更改文件名。

好消息。 从技术上讲,“如何克隆文件名中带有冒号的文件”的答案是简单地使用“git clone”。 幸运的是,只有在 Windows 上(甚至在 msysgit 下)失败的结帐,并且有一个相当干净的解决方法如下所示。

TL; 博士

在 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 中的冒号重命名文件(不提取它们)
  • 仅提取您重命名的那些文件
  • 将这些重命名的文件添加到您的工作目录中

要深入了解上面列出的几个步骤,请继续阅读......

在使用带有各种文件名的冒号的 repo 时,我能够解决这个问题。 以下对我有用:

  • 做一个常规的 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

从工作目录中删除有问题的文件后...

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

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

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

这是解决此问题的另一种方法(通过使用 WSL):(Windows 11)

1. 启用虚拟化:

  • 在 BIOS 中
  • 在 Windows 中( “打开或关闭 Windows 功能”->“Windows 管理程序平台” -> 检查)

2. 下载并安装 WSL(适用于 Linux 的 Windows 子系统):

  • 在 PowerShell 中:

    wsl --install

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM