Git add命令失败,提示“文件名太长”

11

我初始化了一个Git仓库,以便添加Oracle Weblogic服务器的本地实例(是的!)并使用Git进行版本控制。

Oracle文件位于c:\ Oracle中。因此,我需要将其添加到Git中。

我执行了以下命令

git init(在c:\中有Oracle目录)

在c:\中添加.gitignore目录,并忽略除Oracle之外的所有目录

然后运行'git status'查看状态。正如预期的那样,它显示了以下内容

C:\>git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .gitignore
#       Oracle/
nothing added to commit but untracked files present (use "git add" to track)

现在,我运行了 git add * 命令。如预期的那样,它输出了一些详细信息,显示正在被添加的文件,并以以下内容结束(下面是命令输出的结尾部分)。

....
base_domain/servers/AdminServer/tmp/.appmergegen_1387484701373_liferay-portal-6.
1.30-ee-ga3-20130812170130063.war/html/VAADIN/themes/runo/tree/tree.css.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in Oracle/Middleware/user_projects/domains/
base_domain/servers/AdminServer/tmp/.appmergegen_1387484701373_liferay-portal-6.
1.30-ee-ga3-20130812170130063.war/html/VAADIN/themes/runo/window/window.css.
The file will have its original line endings in your working directory.
fatal: unable to stat 'Oracle/Middleware/user_projects/domains/base_domain/serve
rs/AdminServer/tmp/.appmergegen_1387484701373_liferay-portal-6.1.30-ee-ga3-20130
812170130063.war/html/VAADIN/widgetsets/com.vaadin.portal.gwt.PortalDefaultWidge
tSet/043D1FB3F694D0D6D3ACFB33DB80E43D.cache.html': Filename too long

然后我执行了 git status 命令,查看文件是否已添加

C:\>git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .gitignore
#       Oracle/
nothing added to commit but untracked files present (use "git add" to track)

看起来好像没有添加任何东西。该文件夹是否对Git来说太大了?

我尝试过Bazaar,但每当我使用该代码库时,其GUI控件会冻结。现在我正在尝试Mercurial以查看它是否能处理。


你为什么要在 C:\ 创建存储库并忽略一堆东西,而不是直接在 C:\Oracle\ 中创建存储库呢? - Chris
@Chris 只是为了方便才在 c:\ 中进行操作。如果我在 c:\ 中初始化仓库,而不是在 c:\Oracle.git 中初始化,则可以更轻松地压缩整个 c:\Oracle 目录并在需要时将其发出,而无需包括 .git 文件夹。 - user6123723
1
如果您在“C:\Oracle\”中创建存储库,则应该能够使用“git archive --prefix Oracle -o OracleWeblogicServer.zip”创建适当的zip文件。但这并不能解决您的问题。您是否拥有产品的源代码,或者您正在尝试对应用服务器的已编译版本进行版本控制? - Chris
@user1324816 当然由你决定,但如果你想追踪的话,我可能会倾向于仅对配置目录进行版本控制。Git 不适合对大型二进制文件进行版本控制,而且我不太了解 Weblogic Server,但知道一些关于 Java 和随之而来的 JAR 文件的知识,我怀疑这是你当前存储库的大部分内容。 - Chris
1
问题已在msysgit 1.9中得到解决。 请查看我的回答“git pull aborted with error filename too long”https://dev59.com/EGEi5IYBdhLWcg3wnNTA#22831095 - mloskot
显示剩余2条评论
4个回答

8
重新映射到较短的驱动器,如下所示:subst X: C:\<__相关_冗长_路径__>\

--

我有过类似的经历,证实了Windows的最大路径长度限制为260个字符。
我使用了SUBST(替代)命令来将任何长度的文件夹映射到单个字母驱动器上,例如subst X:C:\<__relevant_lengthy_path__>\
不过,在你的情况下,很不幸的是,你在只有C:\的地方开始了git,这是不寻常和勇敢的:)

6
Cygwin来帮忙了!通过Cygwin的Git运行相同的命令对我很有效。

6

我认为你并不需要那个 .../tmp/... 目录。

当出现任何错误时,git add 命令都会失败。如果添加指定的任何文件出现问题,则不会添加任何内容。

我建议忽略 tmp 目录:

echo tmp >> .gitignore
git add .

这将忽略项目中的所有 tmp 目录。如果你想要忽略特定的 tmp 目录,你可以指定它们的完整路径:

echo path/to/AdminServer/tmp >> .gitignore
git add .

由于你的示例输出中长文件名在tmp目录中,因此忽略该目录后git add .应该可以正常工作。


我忽略了tmp目录,然后成功将文件夹添加到git中。有几件事情:一开始我包含了tmp目录,因为我想捕捉应用服务器的整个状态,而且我不确定这个特定的tmp目录在这方面是否很重要。但现在因为我别无选择,所以我忽略了它。但我很好奇GIT和Mercurial的文件名(大小)限制是什么。 - user6123723
2
我不知道。但问题是特定于Windows的:在我的Mac上,我创建了一个比你的路径长两倍的路径,Git没有任何问题。 - janos
1
这个答案中真正有价值的宝石是 git add 在遇到任何错误时都会失败(如果操作的反馈能让用户知道它是原子性的,那就太好了)-- 点赞! - MandM

4

问题出在Windows系统上:Git for Windows目前不使用win32 API的hack方法,在路径名前加上\\?\,以克服标准路径名长度限制260个字符,而你的路径名超过了这个限制9个字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接