Git отменить изменения в подмодуле рабочего каталога - PullRequest
6 голосов
/ 25 октября 2011

Я работаю в подмодуле и у меня возникают проблемы с открытием папки, полной файлов

$ 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?

Ответы [ 4 ]

9 голосов
/ 07 ноября 2011

Я согласен с Ричардом, что это может проистекать из проблемы чувствительности / нечувствительности к регистру.Я решу эту проблему с помощью этого ответа.

Задача

Если коммит git содержит два файла, имена которых отличаются только регистром, извлеките этот коммит в рабочий каталогв нечувствительной к регистру файловой системе возникают проблемы.Если коммит содержит, например, 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

Или вы также можете использовать 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


Однако ваш комментарий о ведении журналаВ качестве другого пользователя и получение другого результата указывает, что может быть другая проблема.В таком случае я бы увидел, есть ли какие-либо различия в пользовательских файлах .gitconfig.

2 голосов
/ 05 ноября 2011

Возможно, вы столкнулись с проблемой чувствительности к регистру.По умолчанию файловые системы Mac сохраняют регистр, но не чувствительны к регистру.

Сам Git чувствителен к регистру.Если у вас нет чувствительной к регистру файловой системы и есть два файла, чьи имена отличаются только регистром, git status покажет один из файлов как измененный (при условии, что содержимое этих двух файлов отличается).Если у вас есть две директории , имена которых отличаются только регистром (например, fckeditor и FCKeditor), то Git может отображать множество измененных файлов.

Попробуйте создать с учетом регистраобъем и запустить git clone там.

2 голосов
/ 25 октября 2011

Для очистки неотслеживаемого файла вы должны использовать

git clean -xdf

вместо

git clean -f только

-d. Удалить неотслеживаемые каталоги вдополнение к неотслеживаемым файлам.Если неотслеживаемый каталог управляется другим Git-репозиторием, по умолчанию он не удаляется.Используйте параметр -f дважды, если вы действительно хотите удалить такой каталог.

-x Не используйте правила игнорирования.Это позволяет удалить все неотслеживаемые файлы, включая продукты сборки.Это может быть использовано (возможно, в сочетании с git reset) для создания первичного рабочего каталога для тестирования чистой сборки.

1 голос
/ 05 ноября 2011

Перейдите в каталог подмодулей - это его собственное репо - прежде чем выполнять операции с этим подмодулем репо.После этого вы сможете очистить и исправить репозиторий субмодуля «обычными способами».

Различные статьи подмодулей (книга сообщества progit & git), хотя они и упоминают об этом, не так ясны, как необходимо, чтобы выбрать этот момент.

...