Git丢弃工作目录子模块中的更改

时间:2011-10-25 15:48:10

标签: git git-submodules

我正在使用子模块,并且无法解开一个装满文件的文件夹

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
    #   modified:   public/javascripts/app/fckeditor/editor/skins/office2003/fck_dialog.css
    #   modified:   public/javascripts/app/fckeditor/editor/skins/office2003/fck_editor.css
    #   modified:   public/javascripts/app/fckeditor/editor/skins/silver/fck_dialog.css
    #   modified:   public/javascripts/app/fckeditor/editor/skins/silver/fck_editor.css
    #   modified:   public/javascripts/app/fckeditor/fckconfig.js
    #   modified:   public/javascripts/app/fckeditor/fckeditor.js
    #   modified:   public/javascripts/app/fckeditor/fckpackager.xml

我输入

git reset --hard

返回

  

HEAD现在没有b2c5a77

但是当我输入

git status

我再次受到长长的文件列表的欢迎。我试过

git clean -f 

并删除整个子模块并从主服务器检出。 我还试图删除子模块所属的整个项目,拉出然后启动并更新子模块,但无济于事。

rm -rf project
git clone foo@bar.project.net:/home/rails/repo/gits/project.com
#Cloning into project...
#remote: Counting objects: 2452, done.
#remote: Compressing objects: 100% (2040/2040), done.
#remote: Total 2452 (delta 1238), reused 582 (delta 145)
#Receiving objects: 100% (2452/2452), 561.32 KiB | 438 KiB/s, done.
#Resolving deltas: 100% (1238/1238), done.
cd project.com
git submodule init
git submodule update
#Cloning into vendor/plugins/project_engine...
cd vendor/plugins/project_engine
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   public/javascripts/app/fckeditor/editor/skins/office2003/fck_dialog.css
#   modified:   public/javascripts/app/fckeditor/editor/skins/office2003/fck_editor.css
#   modified:   public/javascripts/app/fckeditor/editor/skins/silver/fck_dialog.css
#   modified:   public/javascripts/app/fckeditor/editor/skins/silver/fck_editor.css
#   modified:   public/javascripts/app/fckeditor/fckconfig.js
#   modified:   public/javascripts/app/fckeditor/fckeditor.js
#   modified:   public/javascripts/app/fckeditor/fckpackager.xml

似乎唯一删除文件的是我在Mac上登录为另一种用途,这让我认为这是我的本地机器而不是回购本身的问题。

我还尝试卸载并重新安装GIT,目前正在运行1.7.5.4安装并且遵循brew(Ruby包管理器)的帮助。

如何从git status中删除这些文件?

4 个答案:

答案 0 :(得分:9)

我同意Richard的观点,可能源于区分大小写/不敏感问题。我将用这个答案解决这个问题。

<强>问题

如果git commit包含两个名称仅在大小写不同的文件,则检查对不区分大小写的文件系统中的工作目录的提交会导致问题。如果提交包含,例如myfilemyFILE,git将创建myfile,然后当它转到创建/更新myFILE时,文件系统会给它一个句柄到myfile

如果myfile和myFILE在存储库中有不同的内容,这一点就变得很明显了。签出文件时,第二个“获胜”,物理文件包含第二个文件的内容。执行git status时,索引中的两个文件都会与工作目录中的同一文件进行比较,对于丢失文件,内容不匹配。

验证问题

您可以在区分大小写的系统上签出存储库,以分析和解决那里的所有内容。或者,git确实提供了足够的工具来处理您当前的系统。

查看这是否真的是问题的简单方法是对列出的文件之一进行微不足道的修改。然后,运行git status应显示文件名的两种变体,因为工作目录版本与索引中的任一版本都不匹配:

$ echo >> public/javascripts/app/fckeditor/fckpackager.xml
$ git status
Possible outcome:
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   ...
#   modified:   public/javascripts/app/fckeditor/fckpackager.xml
#   modified:   public/javascripts/app/fckeditor/FCKPACKAGER.xml

或者,您也可以使用git ls-files查看索引中的内容:

$ git ls-files public/javascripts/app/fckeditor/fckpackager.xml
public/javascripts/app/fckeditor/fckpackager.xml
public/javascripts/app/fckeditor/FCKPACKAGER.xml

如果要查看每个文件中的确切内容,可以使用git checkout-index从索引中提取文件并将其保存在某处(使用前缀,以便将内容写入单独的文件):

$ git checkout-index --prefix=v1/ public/javascripts/app/fckeditor/fckpackager.xml
$ git checkout-index --prefix=v2/ public/javascripts/app/fckeditor/FCKPACKAGER.xml

解决

一旦弄清楚要删除的每个文件的哪个变体,就可以使用git rm --cached将其从索引中删除,$ git rm --cached public/javascripts/app/fckeditor/FCKPACKAGER.xml 尊重给定路径的情况:

git reset --hard

然后提交,如有必要,再做另一个{{1}}


但是,您对以不同用户身份登录并获得不同结果的评论表明可能存在其他问题。在这种情况下,我会看到用户特定的.gitconfig文件是否存在任何差异。

答案 1 :(得分:2)

要清除未跟踪的文件,您应该使用

git clean -xdf

而不是

git clean -f

-d            除了未跟踪的文件之外,删除未跟踪的目录。如果没有跟踪            目录由不同的git存储库管理,不会被删除            默认。如果你真的想删除这样的目录,请使用-f选项两次。

-x            不要使用忽略规则。这允许删除所有未跟踪的文件,            包括构建产品。这可以使用(可能与git一起使用)            reset)创建一个pristine工作目录来测试一个干净的构建。

答案 2 :(得分:2)

您可能遇到区分大小写问题。默认情况下,Mac文件系统保留大小写但不区分大小写。

Git本身区分大小写。如果您没有区分大小写的文件系统,并且检查了两个文件,其名称仅因大小写而异,git status将显示其中一个文件已修改(假设两个文件的内容不同)。如果您有两个目录,其名称仅因大小写而异(例如fckeditorFCKeditor),则Git可能会显示许多已修改的文件。

尝试创建区分大小写的卷并在其中运行git clone

答案 3 :(得分:1)

在对子模块repo执行操作之前,切换到子模块目录 - 它是它自己的repo。然后,您应该能够以通常的方式清理和修复子模块仓库。

各种子模块文章(progit&amp; git社区书籍),虽然他们确实提到过,但并不像选择这一点那样清晰。