假设我在Linux机器上创建了一个小型Git存储库:
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格式,但它与问题无关):
git clone --bare <REMOTE_GIT_REPO_URL>
cd bad-filenames这让我感到惊讶,但是使用git-archive创建存档会导致致命错误,而不管给定的格式是什么:
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/mastererror: invalid path 'con'如果我一个接一个地从提交中删除坏文件名,那么它仍然会导致错误:
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。或者是故意这样实施的?
发布于 2022-01-29 04:18:50
这是经过深思熟虑的:请参阅read-cache.c并注意,这是一个宏,其中一个扩展用于Windows,另一个扩展为非Windows:
int is_valid_win32_path(const char *path, int allow_literal_nul);
#define is_valid_path(path) is_valid_win32_path(path, 0)#ifndef is_valid_path
#define is_valid_path(path) 1
#endif我想知道,这是Git的Windows实现中的一个bug吗?
好恶不同。错误或特征:由你决定。
https://stackoverflow.com/questions/70892471
复制相似问题