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

wkftcu5l  于 2023-11-21  发布在  Windows
关注(0)|答案(6)|浏览(301)

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

shstlldc

shstlldc1#

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

  • TL;DR*

在Git Bash中...

  1. git clone {repo URL}
  2. cd {repo dir}
  3. git ls-tree -r master --name-only | grep -v ":" | xargs git reset HEAD
  4. git commit -m "deleting all files with a colon in the name"
  5. git restore .

字符串
然后

  • 下载整个git repo的Zip
  • 在Zip中用冒号重命名文件(不解压缩它们)
  • 只提取那些文件你重命名
  • 将这些重命名的文件添加到工作目录
    要深入了解上面列出的几个步骤,请继续阅读.

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

  • 做一个常规的git克隆。

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

  1. Cloning into 'dropwizard-auth-example'...
  2. remote: Enumerating objects: 322, done.
  3. remote: Total 322 (delta 0), reused 0 (delta 0), pack-reused 322
  4. Receiving objects: 100% (322/322), 15.00 MiB | 2.88 MiB/s, done.
  5. Resolving deltas: 100% (72/72), done.
  6. error: invalid path 'src/test/resources/revoker/example-ca/certs/root.localhost:9000.cert.pem'
  7. fatal: unable to checkout working tree
  8. warning: Clone succeeded, but checkout failed.
  9. You can inspect what was checked out with 'git status'
  10. and retry with 'git restore --source=HEAD :/'

  • 将目录更改为新克隆的存储库

cd dropwizard-auth-example

  • 检查git repo工作目录是否完全为空

ls

  • 运行git-status,发现所有文件都已暂存以待删除

$ git status
输出...

  1. On branch master
  2. Your branch is up to date with 'origin/master'.
  3. Changes to be committed:
  4. (use "git restore --staged <file>..." to unstage)
  5. deleted: .gitignore
  6. deleted: .travis.yml
  7. deleted: LICENSE
  8. deleted: NOTICE
  9. deleted: README.md
  10. deleted: conf.yml
  11. ...

  • 恢复分段删除 * 仅 * 文件名中不 * 包含冒号的文件。

$ git ls-tree -r master --name-only | grep -v ":" | xargs git reset HEAD
输出...

  1. Unstaged changes after reset:
  2. D .gitignore
  3. D .travis.yml
  4. D LICENSE
  5. D NOTICE
  6. D README.md
  7. D conf.yml
  8. D java-cacerts.jks
  9. D pom.xml
  10. D src/main/java/wdawson/samples/dropwizard/UserInfoApplication.java
  11. D src/main/java/wdawson/samples/dropwizard/api/UserInfo.java
  12. D src/main/java/wdawson/samples/dropwizard/auth/OAuth2Authenticator.java
  13. D src/main/java/wdawson/samples/dropwizard/auth/OAuth2Authorizer.java
  14. D src/main/java/wdawson/samples/dropwizard/auth/Role.java
  15. ...

  • 再次运行git status,只会看到文件名中包含冒号的文件被暂存以待删除。其他文件仍然显示为已删除,但不会暂存以待提交。这就是我们在这个阶段想要的。

$ git status
输出...

  1. On branch master
  2. Your branch is up to date with 'origin/master'.
  3. Changes to be committed:
  4. (use "git restore --staged <file>..." to unstage)
  5. deleted: src/test/resources/revoker/example-ca/certs/root.localhost:9000.cert.pem
  6. deleted: src/test/resources/revoker/example-ca/csr/root.localhost:9000.csr.pem
  7. deleted: src/test/resources/revoker/example-ca/intermediate/certs/intermediate.localhost:9000.cert.pem
  8. deleted: src/test/resources/revoker/example-ca/intermediate/csr/intermediate.localhost:9000.csr.pem
  9. deleted: src/test/resources/revoker/example-ca/intermediate/private/intermediate.localhost:9000.key.pem
  10. deleted: src/test/resources/revoker/example-ca/private/root.localhost:9000.key.pem
  11. Changes not staged for commit:
  12. (use "git add/rm <file>..." to update what will be committed)
  13. (use "git restore <file>..." to discard changes in working directory)
  14. deleted: .gitignore
  15. deleted: .travis.yml
  16. deleted: LICENSE
  17. deleted: NOTICE
  18. deleted: README.md
  19. deleted: conf.yml
  20. deleted: java-cacerts.jks
  21. 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#

如果你尝试做:

  1. 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

  1. git clone --sparse -c core.protectNTFS=false -n <YOUR REPO>
  2. cd <INTO YOUR REPO'S NEWLY CREATED SUBFOLDER>
  3. git sparse-checkout add \* !\path\to\evil\file:with.colon
  4. git checkout <BRANCH NAME, POTENTIALLY JUST "main">
  5. 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 "{}"将确保包含空格的文件路径也将被保留。

相关问题