如何使用文件名中的冒号克隆文件

Jon*_*Day 9 windows git filenames

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

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

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

RJL*_*ers 11

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

... 进而

  • 下载整个 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 :/'
Run Code Online (Sandbox Code Playgroud)
  • 将目录更改为新的克隆存储库

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
...
Run Code Online (Sandbox Code Playgroud)
  • 还原上演的缺失只是那些文件包含在文件名冒号。

$ 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
...
Run Code Online (Sandbox Code Playgroud)
  • 再次运行 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
Run Code Online (Sandbox Code Playgroud)
  • 提交所有暂存文件。即提交删除所有文件名中包含冒号的文件。

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 完成类似的步骤。


man*_*lds 10

如果你尝试做:

touch "styles-ie (1:12:11 6:02 PM).css"
Run Code Online (Sandbox Code Playgroud)

您将看到无法在Windows上创建它.

基本上,repo有文件(blob和树条目)但你不能在Windows上签出,因为git将无法创建这样的文件.没有其他办法,只能更改文件名.


小智 6

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