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

wkftcu5l  于 7个月前  发布在  Windows
关注(0)|答案(6)|浏览(122)

当我使用msysgit克隆存储库时,所有文件名中含有空格的文件都不会被删除,然后在状态中显示为已删除。
文件名看起来像这样:styles-ie (1:12:11 6:02 PM).css,所以它实际上可能是冒号或括号?
我如何获取这些文件以使我的本地存储库与源代码内联?

shstlldc

shstlldc1#

**好消息。**从技术上讲,“如何克隆文件名中带有冒号的文件”的答案是简单地使用“git clone”。幸运的是,在Windows上只有 checkout 失败(即使在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中用冒号重命名文件(不解压缩它们)
  • 只提取那些文件你重命名
  • 将这些重命名的文件添加到工作目录
    要深入了解上面列出的几个步骤,请继续阅读.

我能够在使用各种文件名中包含冒号的repo时解决这个问题。以下方法对我有效:

  • 做一个常规的git克隆。

第一个月
您应该看到以下错误,指出克隆成功,但 checkout 失败。

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工作目录

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

wsxa1bj1

wsxa1bj12#

如果你尝试做:

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

字符串
你会发现你不能在Windows上创建它。
基本上,仓库有文件(blob和树条目),但你不能在Windows上 checkout ,因为git无法创建这样的文件。没有其他方法,只能更改文件名。

gr8qqesn

gr8qqesn3#

你可以在Linux环境下克隆这个仓库,将其压缩并复制到Windows上,然后在Windows上使用7zip之类的工具解压缩。7zip会将冒号替换为下划线,并保留所有的git信息。只要这个文件没有改变,你就可以在一段时间内完成所有的设置。这些文件通常不会有太大的改变(例如,我有一个中间有一个冒号的cert文件)。

cgyqldqp

cgyqldqp4#

为了支持“使用WSL”或“使用Linux环境”的答案:
使用WSL:(Windows 11)

1.启用虚拟化:

  • 在BIOS中
  • 在Windows中(“打开或关闭Windows功能”->“虚拟机平台”/“用于Linux的Windows子系统” ->检查)
    2.下载并安装Linux发行版(如Ubuntu - latest):
  • 在PowerShell中:
  • wsl --install -d Ubuntu*
    3. WSL Linux控制台克隆仓库

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

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

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

lvjbypge

lvjbypge5#

*Windows**下的Purly

git clone --sparse -c core.protectNTFS=false -n <YOUR REPO>
cd <INTO YOUR REPO'S NEWLY CREATED SUBFOLDER>
git sparse-checkout add \* !\path\to\evil\file:with.colon
git checkout <BRANCH NAME, POTENTIALLY JUST "main">
git rm path\to\evil\file:with.colon

字符串
可能也会删除一个实际 checkout 的“path\to\evil\file”(一个没有冒号的版本),提交,推送,(现在你已经可以在windows上 checkout 当前版本了),如果你需要的话,用更好的名字创建一个文件。

**虚拟提示:**将path\to\evil\file:with.colon替换为你的邪恶文件路径,相对于项目根目录(但保持!在它前面,在第3行,例如!/static/icons/some.png:With.Id)。
**识别:**关于@RomanOrekhov被删除的答案(虽然不完整,但由于使用稀疏校验,它被错误地删除为重复,因为没有答案表明明显的路线)。

gcuhipw9

gcuhipw96#

要添加到RJLyders答案,使用git ls-tree -r main --name-only | grep -v ":" | xargs -I {} git reset HEAD "{}"将确保包含空格的文件路径也将被保留。

相关问题