Частичная ошибка git stash из-за неправильно упорядоченных аргументов и потерянных файлов - PullRequest
0 голосов
/ 23 октября 2018

У меня было несколько измененных файлов, и у меня было 2 неотслеживаемых файла.

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

, поэтому я запустил

git stash push -u  -- File/Path/To/FolderOfFilesIWantCommited/* -m "My Message"

Это вернуло это

Saved working directory and index state WIP on [Branch Name]: [Commit Sha1] [commit message]
fatal: pathspec '-m' did not match any files
error: unrecognized input

Это сообщение, почему ясказал "частичный сбой" в названии ... не совсем понятно, что здесь произошло

Я понял, что я должен был бежать, было

git stash push -u -m "My Message"  -- File/Path/To/FolderOfFilesIWantCommited/* 

Однако после неудачной первой попыткивсе мои модификации остались неизменными, но присутствовали.Однако 2 неотслеживаемых файла исчезли.Я действительно мог бы вернуться с ними, поэтому любая помощь будет принята с благодарностью

Просто добавьте примечание: я запустил это в Powershell, используя PoshGit, который является причиной одного или нескольких сообщений об ошибках.Думаю, я бы включил это, так как это может запутать других

1 Ответ

0 голосов
/ 23 октября 2018

TL; DR: вы столкнулись с ошибкой, исправленной в commit 833622a945a6, "stash push: избежать ошибок печати" , которая впервые появилась в Git 2.18.0.Если ваш Git по крайней мере 2.16.2, вы в порядке, в противном случае вы можете столкнуться с более серьезной ошибкой, исправленной в commit bba067d2faf0, "stash: не удаляйте неотслеживаемые файлы, которые соответствуют pathspec" но никогда не вызывается в примечаниях к выпуску.

Подкоманда push, которая принимает pathspecs, впервые появилась в Git 2.13.0.Он был довольно сломан, если запускался из подкаталога, пока не был исправлен в 2.13.2 / 2.14.0.И до 2.16.2 он вел себя плохо: он мог запускать git clean слишком много файлов.Так как git clean удаляет неотслеживаемые файлы (необязательно включая их игнорируемое подмножество), а неотслеживаемые файлы не фиксируются (за исключением специального -u / -a коммита), они могут быть просто ушел на данный момент.

Если вы в порядке - если ваш Git по крайней мере 2.16.2, что я думаю, - просто проигнорируйте жалобу;git stash pop stash и повторите команду с исправленными аргументами, чтобы получить stash, названный так, как вы просили.Если нет, то файлы, ошибочно очищенные с помощью git clean, вообще не могут быть восстановлены через Git (но я думаю, учитывая то, что я думаю, что вы запустили плюс сообщение об ошибке, что вы в порядке).

(я рекомендую избегатьхитрое использование git stash в большинстве случаев - обычно лучше просто сделать временную фиксацию. Вы также избежите опрокидывания таких ошибок.)

Long

Во-первых, быстрая сторонапримечание: что git stash делает, это делает (или использует) коммиты, в частности, два (обычный тайник) или три (stash -u или stash -a), которые находятся в no ветви.Эти два или три коммита содержат:

  • состояние индекса;
  • состояние рабочего дерева;
  • любые неотслеживаемые файлы, если используются -u или -a.

git stash push и некоторые из его ошибок

git stash push -u  -- File/Path/To/FolderOfFilesIWantCommited/* -m "My Message"

[которые затем не удалось выполнить]

Saved working directory and index state <msg>
fatal: pathspec '-m' did not match any files
error: unrecognized input

Это имеет смысл, потому что -- указывает на конец опций, после чего все строки берутся как path-names или pathspecs (обобщение имен путей, в которых такие вещи, как *значит "все файлы").В этом случае вы дали Git следующие три пути:

  • File/Path/To/FolderOfFilesIWantCommited/*
  • -m
  • My Message

Этиконкретные файлы, которые Git должен сохранять в коммитах, которые он делает.Здесь есть несколько странных складок из-за того, что в общем случае любой коммит сохраняет каждый (отслеживаемый) файл.В основном мы можем игнорировать этот факт - хотя git stash save сохраняет все отслеживаемые файлы в двух основных коммитах, спецификация пути указывает git stash , какую версию сохранить в коммите рабочего дерева:следует ли сохранить версию work-tree или index версию?Если путь совпадает с отслеживаемым файлом, версия рабочего дерева - это сохраненная версия;в противном случае индексная версия - это сохраненная версия.(При фиксации индекса все содержимое индекса сохраняется таким же, каким оно было в момент запуска git stash, используя, как обычно, git write-tree.)

Это третий коммит, сделанный -u или -aгде спецификация пути наиболее важна для вас здесь: она ограничивает коммит, содержащий только соответствующих неотслеживаемых файлов, а не все неотслеживаемые (и, возможно, игнорируемые, с -a) файлами.Здесь также возникает неприятная ошибка: сохраняя содержимое файлов в коммитах, git stash запускает, по сути, git reset --hard и git clean, чтобы вернуть индекс и состояния рабочего дерева обратно в исходное состояние.и удалите файлы, сохраненные в дополнительном коммите.

Я полагаю, что исправление, добавленное в 2.16.2, вызывает жалобу, исправленную в 2.18.0.Если это так, это означает, что ваш git stash push не удалил слишком много файлов;вместо этого он очистил нужные файлы - те, которые были сохранены в третьем коммите - и затем пожаловался, потому что ваш путь доступа соответствовал только неотслеживаемым файлам и / или из-за дополнительных аргументов, которые соответствовали no файлам.

ВВ крайнем случае, если вы просто хотите получить файлы в третьем коммите "u" без использования git stash, попробуйте запустить git show stash^^3 | git apply (примечание: это git show stash, сначала слово show, а не git stash show!).Третий коммит, который сделал git stash, является третьим родителем refs/stash, следовательно, stash^3.В PowerShell я считаю, что это должно быть написано с удвоенной ^.Вы можете запустить git show stash^^3 (с тем же удвоением), чтобы просмотреть его перед его применением.

...