首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >git-存档在Windows上不适用于特殊的文件名,甚至对于裸存储库也是如此。它是实现的缺陷吗?

git-存档在Windows上不适用于特殊的文件名,甚至对于裸存储库也是如此。它是实现的缺陷吗?
EN

Stack Overflow用户
提问于 2022-01-28 10:48:47
回答 1查看 73关注 0票数 0

假设我在Linux机器上创建了一个小型Git存储库:

代码语言:javascript
复制
git init bad-filenames
cd bad-filenames
touch con prn.ext ':' '\'
git add .
git commit -m 'bad filenames'
git push <REMOTE_GIT_REPO_URL> master

现在,在Windows机器上,我克隆了回购文件,使其成为空文件,因为上面的任何文件都不能在Windows机器上签出,因为由于已知的原因,它们的文件名不受支持(是的,我也知道UNC path格式,但它与问题无关):

代码语言:javascript
复制
git clone --bare <REMOTE_GIT_REPO_URL>
cd bad-filenames

这让我感到惊讶,但是使用git-archive创建存档会导致致命错误,而不管给定的格式是什么:

代码语言:javascript
复制
git archive origin/master
git archive --format=tar origin/master
git archive --format=tar.gz origin/master
git archive --format=tgz origin/master
git archive --format=zip origin/master
代码语言:javascript
复制
error: invalid path 'con'

如果我一个接一个地从提交中删除坏文件名,那么它仍然会导致错误:

代码语言:javascript
复制
error: invalid path ':'

error: invalid path '\'

error: invalid path 'prn.ext'

上面的git-archive在Linux机器上运行得很好。我用于测试的Git服务还可以生成一个有效的存档,至少可以通过使用Far Manager之类的工具在Windows机器上打开(当试图计算它的大小时,它会进入堆栈溢出,认为它是路径/,但是成功地将所有文件分别重命名为_: )和7-Zip ( GUI乍一看似乎很好,但是7z x <ARCHIVE_FILE_PATH>\:合并到一个名为_的文件中)。

我想知道,这是Git的Windows实现中的一个bug吗?我倾向于这样认为的原因是,所有这些格式都可以通过编程方式生成(因此可以从存储库直接读取blobs并将它们写入目标归档流),但看起来目标文件系统是阻止器,不管我是否使用--output选项或shell重定向,>甚至写入nul。或者是故意这样实施的?

EN

回答 1

Stack Overflow用户

发布于 2022-01-29 04:18:50

这是经过深思熟虑的:请参阅read-cache.c并注意,这是一个宏,其中一个扩展用于Windows,另一个扩展为非Windows:

compat/mingw.h

代码语言:javascript
复制
int is_valid_win32_path(const char *path, int allow_literal_nul);
#define is_valid_path(path) is_valid_win32_path(path, 0)

git-compat-util.h

代码语言:javascript
复制
#ifndef is_valid_path
#define is_valid_path(path) 1
#endif

我想知道,这是Git的Windows实现中的一个bug吗?

好恶不同。错误或特征:由你决定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70892471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档