当我使用msysgit克隆存储库时,所有文件名中含有空格的文件都不会被删除,然后在状态中显示为已删除。文件名看起来像这样:styles-ie (1:12:11 6:02 PM).css,所以它实际上可能是冒号或括号?我如何获取这些文件以使我的本地存储库与源代码内联?
styles-ie (1:12:11 6:02 PM).css
shstlldc1#
**好消息。**从技术上讲,“如何克隆文件名中带有冒号的文件”的答案是简单地使用“git clone”。幸运的是,在Windows上只有 checkout 失败(即使在msysgit下),并且有一个相当干净的解决方案,如下所示。
在Git Bash中...
git clone {repo URL}cd {repo dir}git ls-tree -r master --name-only | grep -v ":" | xargs git reset HEADgit commit -m "deleting all files with a colon in the name"git restore .
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 .
字符串然后
我能够在使用各种文件名中包含冒号的repo时解决这个问题。以下方法对我有效:
第一个月您应该看到以下错误,指出克隆成功,但 checkout 失败。
Cloning into 'dropwizard-auth-example'...remote: Enumerating objects: 322, done.remote: Total 322 (delta 0), reused 0 (delta 0), pack-reused 322Receiving 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 treewarning: Clone succeeded, but checkout failed.You can inspect what was checked out with 'git status'and retry with 'git restore --source=HEAD :/'
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个
cd dropwizard-auth-example
ls个
ls
$ git status个输出...
$ git status
On branch masterYour 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...
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个输出...
$ git ls-tree -r master --name-only | grep -v ":" | xargs git reset HEAD
Unstaged changes after reset:D .gitignoreD .travis.ymlD LICENSED NOTICED README.mdD conf.ymlD java-cacerts.jksD pom.xmlD src/main/java/wdawson/samples/dropwizard/UserInfoApplication.javaD src/main/java/wdawson/samples/dropwizard/api/UserInfo.javaD src/main/java/wdawson/samples/dropwizard/auth/OAuth2Authenticator.javaD src/main/java/wdawson/samples/dropwizard/auth/OAuth2Authorizer.javaD src/main/java/wdawson/samples/dropwizard/auth/Role.java...
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
On branch masterYour 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.pemChanges 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
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: java-cacerts.jks
deleted: pom.xml
git commit -m "deleting all files with a colon in the name"个
$ git restore .个
$ git restore .
$ ls个输出...conf.yml java-cacerts.jks LICENSE NOTICE pom.xml README.md src个一旦你从你的工作目录中删除了违规文件.
$ ls
conf.yml java-cacerts.jks LICENSE NOTICE pom.xml README.md src
附言:以上所有操作都是在Windows 10上的GitBash中使用git版本2.25.1.windows.1完成的。类似的步骤可以在Windows上使用TortoiseGit通过GUI完成。
wsxa1bj12#
如果你尝试做:
touch "styles-ie (1:12:11 6:02 PM).css"
字符串你会发现你不能在Windows上创建它。基本上,仓库有文件(blob和树条目),但你不能在Windows上 checkout ,因为git无法创建这样的文件。没有其他方法,只能更改文件名。
gr8qqesn3#
你可以在Linux环境下克隆这个仓库,将其压缩并复制到Windows上,然后在Windows上使用7zip之类的工具解压缩。7zip会将冒号替换为下划线,并保留所有的git信息。只要这个文件没有改变,你就可以在一段时间内完成所有的设置。这些文件通常不会有太大的改变(例如,我有一个中间有一个冒号的cert文件)。
cgyqldqp4#
为了支持“使用WSL”或“使用Linux环境”的答案:使用WSL:(Windows 11)
1.启用虚拟化:
在WSL被安装之后-运行应用程序“WSL”-将会有一个可用的Linux控制台。在那个linux控制台中-像你通常做的那样克隆存储库**。
**在我的例子中,我以root身份登录(>sudo su),创建ssh密钥,将公共ssh密钥添加到github repo,导航到所需目录并克隆ssh repo。
因此,通过WSL控制台,我可以看到带有“:“的文件。通过另一个文件管理器,控制台(文件资源管理器,PowerShell,cmd,git CLI)-代替冒号显示不同的符号。
lvjbypge5#
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.colongit checkout <BRANCH NAME, POTENTIALLY JUST "main">git rm path\to\evil\file:with.colon
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被删除的答案(虽然不完整,但由于使用稀疏校验,它被错误地删除为重复,因为没有答案表明明显的路线)。
path\to\evil\file:with.colon
!
!/static/icons/some.png:With.Id
gcuhipw96#
要添加到RJLyders答案,使用git ls-tree -r main --name-only | grep -v ":" | xargs -I {} git reset HEAD "{}"将确保包含空格的文件路径也将被保留。
git ls-tree -r main --name-only | grep -v ":" | xargs -I {} git reset HEAD "{}"
6条答案
按热度按时间shstlldc1#
**好消息。**从技术上讲,“如何克隆文件名中带有冒号的文件”的答案是简单地使用“git clone”。幸运的是,在Windows上只有 checkout 失败(即使在msysgit下),并且有一个相当干净的解决方案,如下所示。
在Git Bash中...
字符串
然后
要深入了解上面列出的几个步骤,请继续阅读.
我能够在使用各种文件名中包含冒号的repo时解决这个问题。以下方法对我有效:
第一个月
您应该看到以下错误,指出克隆成功,但 checkout 失败。
型
cd dropwizard-auth-example
个ls
个$ git status
个输出...
型
$ git ls-tree -r master --name-only | grep -v ":" | xargs git reset HEAD
个输出...
型
$ git status
个输出...
型
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
个一旦你从你的工作目录中删除了违规文件.
附言:以上所有操作都是在Windows 10上的GitBash中使用git版本2.25.1.windows.1完成的。类似的步骤可以在Windows上使用TortoiseGit通过GUI完成。
wsxa1bj12#
如果你尝试做:
字符串
你会发现你不能在Windows上创建它。
基本上,仓库有文件(blob和树条目),但你不能在Windows上 checkout ,因为git无法创建这样的文件。没有其他方法,只能更改文件名。
gr8qqesn3#
你可以在Linux环境下克隆这个仓库,将其压缩并复制到Windows上,然后在Windows上使用7zip之类的工具解压缩。7zip会将冒号替换为下划线,并保留所有的git信息。只要这个文件没有改变,你就可以在一段时间内完成所有的设置。这些文件通常不会有太大的改变(例如,我有一个中间有一个冒号的cert文件)。
cgyqldqp4#
为了支持“使用WSL”或“使用Linux环境”的答案:
使用WSL:(Windows 11)
1.启用虚拟化:
2.下载并安装Linux发行版(如Ubuntu - latest):
3. WSL Linux控制台克隆仓库
在WSL被安装之后-运行应用程序“WSL”-将会有一个可用的Linux控制台。在那个linux控制台中-像你通常做的那样克隆存储库**。
**在我的例子中,我以root身份登录(>sudo su),创建ssh密钥,将公共ssh密钥添加到github repo,导航到所需目录并克隆ssh repo。
因此,通过WSL控制台,我可以看到带有“:“的文件。通过另一个文件管理器,控制台(文件资源管理器,PowerShell,cmd,git CLI)-代替冒号显示不同的符号。
lvjbypge5#
*Windows**下的Purly
字符串
可能也会删除一个实际 checkout 的“path\to\evil\file”(一个没有冒号的版本),提交,推送,(现在你已经可以在windows上 checkout 当前版本了),如果你需要的话,用更好的名字创建一个文件。
**虚拟提示:**将
path\to\evil\file:with.colon
替换为你的邪恶文件路径,相对于项目根目录(但保持!
在它前面,在第3行,例如!/static/icons/some.png:With.Id
)。**识别:**关于@RomanOrekhov被删除的答案(虽然不完整,但由于使用稀疏校验,它被错误地删除为重复,因为没有答案表明明显的路线)。
gcuhipw96#
要添加到RJLyders答案,使用
git ls-tree -r main --name-only | grep -v ":" | xargs -I {} git reset HEAD "{}"
将确保包含空格的文件路径也将被保留。