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

Kar*_*tle 6 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
Run Code Online (Sandbox Code Playgroud)

我打字

git reset --hard
Run Code Online (Sandbox Code Playgroud)

返回

HEAD现在在b2c5a77什么都没有

但是当我打字的时候

git status
Run Code Online (Sandbox Code Playgroud)

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

git clean -f 
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

tco*_*ovo 9

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

问题

如果git commit包含两个名称仅在大小写不同的文件,则检查对不区分大小写的文件系统中的工作目录的提交会导致问题.例如,如果提交包含,myfile并且myFILE,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
Run Code Online (Sandbox Code Playgroud)

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

$ git ls-files public/javascripts/app/fckeditor/fckpackager.xml
public/javascripts/app/fckeditor/fckpackager.xml
public/javascripts/app/fckeditor/FCKPACKAGER.xml
Run Code Online (Sandbox Code Playgroud)

如果要查看每个文件中的确切内容,可以使用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
Run Code Online (Sandbox Code Playgroud)

解析度

一旦弄清楚要删除的每个文件的哪个变体,就可以使用索引将其从索引中删除git rm --cached,这取决于给定路径的情况:

$ git rm --cached public/javascripts/app/fckeditor/FCKPACKAGER.xml
Run Code Online (Sandbox Code Playgroud)

然后提交,如有必要,再做一次 git reset --hard


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