Удаленный файл vcs.xml при обновлении git из-за проблем с конфликтом, и моя программа перестала работать [дублировать]

Для тех, кто находит это в будущем, я бы не рекомендовал использовать mail. Есть несколько ответов, которые касаются этого, но не из-за этого.

Функция PHP mail не только непрозрачна, но и полностью зависит от того, какой MTA вы используете (то есть Sendmail) для выполнения этой работы. mail будет ТОЛЬКО сообщать вам, не удалось ли MTA принять его (т. е. Sendmail был отключен, когда вы пытались отправить). Он не может сказать вам, была ли почта успешной, потому что она была передана. Как таковой (как детали ответов Джона Конде), вы теперь можете возиться с журналами MTA и надеяться, что он расскажет вам об отсутствии возможности исправить его. Если вы находитесь на общем хосте или не имеете доступа к журналам MTA, вам не повезло. К сожалению, по умолчанию для большинства ванильных инсталляций для Linux обрабатывается так.

Почтовая библиотека ( PHPMailer , Zend Framework 2+ и т. д.) делает что-то очень отличное от mail. То, что они делают, это открыть сокет непосредственно на принимающем почтовом сервере, а затем отправить SMTP-почтовые команды непосредственно через этот сокет. Другими словами, класс действует как собственный MTA (обратите внимание, что вы можете сказать библиотекам использовать mail, чтобы в конечном итоге отправить почту, но я настоятельно рекомендую вам не делать этого).

Что это означает, что вы можете непосредственно видеть ответы с принимающего сервера (например, в PHPMailer вы можете включить вывод отладки ). Больше не гадать, если почта не была отправлена ​​или почему.

Если вы используете SMTP (то есть вы вызываете isSMTP()), вы можете получить подробную расшифровку протокола SMTP, используя свойство SMTPDebug.

Установите этот параметр, включив в свой скрипт такую ​​строку:

$mail->SMTPDebug = 2;

Вы также получаете преимущество лучшего интерфейса. С помощью mail вы должны настроить все свои заголовки, вложения и т. Д. С библиотекой у вас есть специальная функция для этого. Это также означает, что функция выполняет все сложные элементы (например, заголовки).

2464
задан 7ochem 24 February 2016 в 12:31
поделиться

20 ответов

Найдите последнюю фиксацию, которая повлияла на данный путь. Поскольку файл не находится в фиксации HEAD, этот фиксатор должен был удалить его.

git rev-list -n 1 HEAD -- <file_path>

Затем проверьте версию на фиксации раньше, используя символ каретки (^):

git checkout <deleting_commit>^ -- <file_path>

Или в одной команде, если $file является файлом, о котором идет речь.

git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"

Если вы используете zsh и включили опцию EXTENDED_GLOB, символ каретки не будет работать. Вместо этого вы можете использовать ~1.

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
2737
ответ дан G. Sliepen 22 August 2018 в 15:58
поделиться
  • 1
    Сложный бит - проверить фиксацию ПЕРЕД, используя суффикс ^. Благодарю. – Christian Oudard 26 April 2010 в 15:40
  • 2
    Что это за «конец»? – ranman 22 April 2011 в 20:32
  • 3
    @Ranman: Это означает «первый родительский элемент». – CB Bailey 22 April 2011 в 20:38
  • 4
  • 5
    Из командной строки Windows я получил ошибку. error: pathspec <filename> did not match any file(s) known to git.. Решение заключалось в использовании git bash. – donturner 26 July 2012 в 19:07
  • 6
    @zoras zsh имеет собственное расширение на «^», я полагаю, но вы можете использовать альтернативный синтаксис «~ 1»: git checkout <deleting-commit>~1 -- <file-path> ~ X позволяет указать X коммит до указанного коммита, поэтому ~ 1 - это фиксация до , ~ 2 - две коммиты до и т. Д. – Nils Luxton 10 September 2012 в 16:07
  • 7
    – Alexander Bird 18 September 2015 в 14:48

git undelete path/to/file.ext

  1. Поместите это в свой .bash_profile (или другой соответствующий файл, который загружается при открытии командной оболочки):
    git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
    
  2. Затем используйте :
    git undelete path/to/file.ext
    

Этот псевдоним сначала проверяет, чтобы найти последнюю фиксацию, в которой находился этот файл, и выполняет ли git checkout этого пути файла от последнего коммита, где этот файл существует. Источник

8
ответ дан Beau Smith 22 August 2018 в 15:58
поделиться

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

Основываясь на данных Чарльза Бейли отличный ответ вот мой один лайнер:

git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)
2
ответ дан bonyiii 22 August 2018 в 15:58
поделиться

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

git checkout HEAD -- path/to/file.ext

101
ответ дан Brett 22 August 2018 в 15:58
поделиться
  • 1
    Благодарю. Меня устраивает. Восстановите файл, который я еще не совершил. – Hua Zhang 11 July 2017 в 18:21
  • 2
    Это просто и просто лучше. – SmallChess 27 November 2017 в 07:27

Если вы безумны, используйте git-bisect . Вот что делать:

git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>

Теперь пришло время запустить автоматизированный тест. Команда оболочки '[ -e foo.bar ]' вернет 0, если foo.bar существует, а 1 - в противном случае. Команда «run» git-bisect будет использовать двоичный поиск, чтобы автоматически находить первое коммандное место, где тест терпит неудачу. Он начинается на полпути через заданный диапазон (от хорошего до плохого) и сокращает его пополам на основе результата указанного теста.

git bisect run '[ -e foo.bar ]'

Теперь вы находитесь в фиксации, которая удалила его. Отсюда вы можете вернуться в будущее и использовать git-revert , чтобы отменить изменение,

git bisect reset
git revert <the offending commit>

, или вы можете вернуться к одному фиксации и вручную проверить повреждение:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .
82
ответ дан Josh Lee 22 August 2018 в 15:58
поделиться
  • 1
    Не могли бы вы подробнее остановиться на git bisect run '[ -e foo.bar ]'? – avdgaag 4 June 2009 в 23:53
  • 2
    Вы также можете использовать хорошие и плохие вручную, если это невозможно проверить автоматически. См. Страницу управления bisect. – Josh Lee 5 June 2009 в 00:00
  • 3
    Это не самое простое решение, но оно впечатляет. Спасибо, что написали. – avdgaag 5 June 2009 в 16:19
  • 4
    @avdgaag git bisect run сообщает Git автоматизировать деление пополам, запустив следующую команду «run», где команда должна вернуть 0 для версии good (подробнее см. git help bisect). '[ -e foo.bar ]' является стандартным выражением для тестирования, если файл foo.bar существует (реализация обычно находится в файле /usr/bin/[, который обычно привязан к /usr/bin/test), а одиночные кавычки используются, чтобы поместить это как одиночный аргумент командной строки. – Mikko Rantalainen 18 March 2013 в 09:18
$ git log --diff-filter=D --summary  | grep "delete" | sort
-2
ответ дан kujiy 22 August 2018 в 15:58
поделиться

Чтобы восстановить все эти удаленные файлы в папке, введите следующую команду:

git ls-files -d | xargs git checkout --
303
ответ дан lesmana 22 August 2018 в 15:58
поделиться
  • 1
    Куда отправляются файлы? Я не вижу никаких изменений. – William Grand 13 September 2013 в 15:36
  • 2
    Это, наверное, самый простой способ. Его извращенный, как трудно git сделал даже самую простую задачу. – jww 19 October 2013 в 05:12
  • 3
    что значит -- ? – Tebe 14 April 2015 в 20:46
  • 4
    git checkout - [fайл] вернет изменения в [fайл]. Труба заменит [fайл] на имя удаленных файлов. – Manu 17 April 2015 в 13:02
  • 5
    Подкоманда ls-files удобна, но, похоже, не работает для файлов, которые были удалены с помощью git rm, т. Е. Поставленного, не говоря уже о том, что было сделано, что и требовал ОП. – MarkHu 17 November 2017 в 09:47

Таким образом, мне пришлось восстановить кучу удаленных файлов из определенного коммита, и я управлял им двумя командами:

git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- 
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

(Обратите внимание на конечное пространство в конце каждой команды. )

Файлы были добавлены в файл .gitignore, а затем очищены с помощью git rm, мне нужно восстановить файлы, но затем отключить их. У меня было сотни файлов для восстановления, набрав все вручную для каждого файла, так как в других примерах было слишком медленно.

42
ответ дан Mark Amery 22 August 2018 в 15:58
поделиться
  • 1
    Да. Это было правильное решение для меня! Простой и понятный – Fabrizio Bertoglio 6 June 2017 в 07:12
  • 2
    Просто использовал это решение и не было фиксации для удаления. Однако мне удалось восстановить файл, используя последний код фиксации. – Adam 26 September 2017 в 16:18
  • 3
    +10 для разъяснения second to last commit! – colminator 29 November 2017 в 22:03
  • 4
    Не будет ли следующая последняя фиксация (предыдущая фиксация для удаления) содержать самую последнюю версию удаленного файла? Второе-последнее (фиксация перед предыдущей фиксацией на удаление) может быть безнадежно устаревшей. – Suncat2000 21 March 2018 в 13:59
  • 5
    Это первое решение, которое я видел, достаточно просто, что мне не придется возвращаться сюда, чтобы найти его в следующий раз. Может быть. – Eloff 3 April 2018 в 21:44

Если вы только вносили изменения и удаляли файл, но не фиксировали его, а теперь вы расстались с вашими изменениями

git checkout -- .

, но ваши удаленные файлы не возвращались, вы просто выполняете следующую команду :

git checkout <file_path>

И престо, ваш файл вернулся.

21
ответ дан Paulo Linhares - Packapps 22 August 2018 в 15:58
поделиться

Во многих случаях полезно использовать coreutils (grep, sed и т. д.) в сочетании с Git. Я уже знаю эти инструменты достаточно хорошо, но Git меньше. Если бы я захотел выполнить поиск удалённого файла, я бы сделал следующее:

git log --raw | grep -B 30 $'D\t.*deleted_file.c'

Когда я нахожу ревизию / фиксацию:

git checkout <rev>^ -- path/to/refound/deleted_file.c

Так же, как другие

Файл будет восстановлен до состояния, которое было перед удалением. Не забудьте повторно зафиксировать его на рабочем дереве, если вы хотите его сохранить.

27
ответ дан Peter Mortensen 22 August 2018 в 15:58
поделиться
  • 1
    Это не сработало для меня. После проверки я получил error: pathspec 'foo' did not match any file(s) known to git., я убедился, что имя файла верное. Git версия 2.7.0 – wisbucky 27 February 2016 в 02:35
  • 2
    -1; это не верно. Эти команды отменит удаление, которое еще не было зафиксировано (первый отключает удаление, если он поставлен, а второй отбрасывает неустановленные изменения в файл), но вы требуете здесь что они вернут удаление файла commit , что просто неверно и с ошибкой, как в комментарии к @ wisbucky выше. – Mark Amery 15 April 2017 в 11:10
  • 3
    @MarkAmery Действительно, я думаю, что эта команда хорошо зарекомендовала себя для тех разработчиков, которые не сделали явной постановки для фиксации для удаленных файлов с помощью git add -A, но так, чтобы восстановленный файл все еще находился в незастроенной стадии. – Fedir RYKHTIK 20 April 2017 в 17:08
  1. Используйте git log --diff-filter=D --summary для получения всех коммитов, которые удалили файлы и удалили файлы;
  2. Используйте git checkout $commit~1 filename для восстановления удаленного файла.

Где $commit - значение фиксации, которое вы нашли на шаге 1, например e4cf499627

729
ответ дан Robert Munteanu 22 August 2018 в 15:58
поделиться
  • 1
    Любопытно, к чему относится ~ 1? – tommy chheng 22 July 2011 в 18:41
  • 2
    @tommy - спецификация тильды даст вам n-й внук именованного коммита. Подробнее см. В book.git-scm.com/4_git_treeishes.html . – Robert Munteanu 23 July 2011 в 13:00
  • 3
    это, безусловно, самый простой и интуитивно понятный подход. git log -- *PartOfMyFileName*. Спасибо за $commit~1 – bgs 11 April 2013 в 00:25
  • 4
    синтаксис git checkout $commit~1 filename отлично подходит для отдельных файлов, а также работает для целых каталогов. т.е.: восстановить все удаленные изображения в ./images из шага 12345: git checkout 12345~1 images. спасибо за этот ответ! – noinput 3 June 2014 в 05:59
  • 5
    @Alexar $commit~1 означает, что вы должны добавить имя фиксации. Что-то вроде 1d0c9ef6eb4e39488490543570c31c2ff594426c, где $commit. – Eugene 7 April 2015 в 06:27

У меня был тот же вопрос.

Список оборванных комманд

git fsck --lost-found

Осмотрите каждую оборванную фиксацию

git reset --hard <commit id>

Мои файлы снова появились, когда я перешел к оборванному фиксации.

git status по причине:

“HEAD detached from <commit id where it detached>”

2
ответ дан rustyMagnet 22 August 2018 в 15:58
поделиться
git checkout /path/to/deleted.file
20
ответ дан the Tin Man 22 August 2018 в 15:58
поделиться
  • 1
    Это тот же подход, что и принятый ответ, но с некоторыми другими способами найти удаление фиксации. Мне все еще нравится подход, принятый в принятом ответе, но это хорошие альтернативы. Благодаря! – avdgaag 14 March 2012 в 12:22
  • 2
    Не будет работать с момента удаления. – akaihola 6 August 2013 в 12:24
  • 3
    Этот для моей ситуации (удаленный непреднамеренно) был самым простым решением. – Paulo Oliveira 7 April 2015 в 14:06
  • 4
    Я предполагаю, что сначала проверяя удаленный файл, а затем (не меняя его), совершая его, не создает файл copy . Правильно? (Мне нужно сделать это с изображениями, а копии сделают репозиторий больше) – Stonecrusher 14 July 2016 в 09:22

Если вы знаете фиксацию, которая удалила файл (ы), запустите эту команду, где <SHA1_deletion> - это фиксация, которая удалила файл:

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

Часть перед каналом перечисляет все файлы которые были удалены в фиксации; все они проверяются с предыдущей фиксации, чтобы восстановить их.

2
ответ дан Tony Wickham 22 August 2018 в 15:58
поделиться
user@bsd:~/work/git$ rm slides.tex
user@bsd:~/work/git$ git pull 
Already up-to-date.
user@bsd:~/work/git$ ls slides.tex
ls: slides.tex: No such file or directory

Восстановить удаленный файл:

user@bsd:~/work/git$ git checkout
D       .slides.tex.swp
D       slides.tex
user@bsd:~/work/git$ git checkout slides.tex 
user@bsd:~/work/git$ ls slides.tex
slides.tex
3
ответ дан user1797498 22 August 2018 в 15:58
поделиться
  • 1
    Вопрос состоял в том, чтобы восстановить файл после его удаления и внесено изменение. Этот ответ касается восстановления файла, который был удален только в рабочем каталоге. – akaihola 6 August 2013 в 12:25
  • 2
    Это правда, и именно этого я и искал. – Hola Soy Edu Feliz Navidad 18 February 2014 в 17:47

Мой новый любимый псевдоним, основанный на bonyiii 's answer (upvoted), и мой собственный ответ о " Передайте аргумент команде alit Git ":

git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'

Я потерял файл, удаленный по ошибке несколькими коммитами назад? Quick:

git restore my_deleted_file

Кризис предотвращен.


Роберт Дайли предлагает в комментариях следующий псевдоним:

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

И jegan добавляет в комментарии :

. Для установки псевдонима из командной строки I использовала эту команду:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 
61
ответ дан VonC 22 August 2018 в 15:58
поделиться
  • 1
    Это восстанавливает весь commit, а не только запрашиваемый файл. – Daniel Bang 28 May 2013 в 18:18
  • 2
    Вот мой псевдоним, прекрасно работает: restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1" – void.pointer 13 March 2014 в 00:27
  • 3
    @RobertDailey Это выглядит великолепно! Я включил ваш псевдоним в ответ для большей видимости. – VonC 13 March 2014 в 09:50
  • 4
    git: 'restore' не является командой git. – resultsway 2 November 2016 в 03:50
  • 5
    Для установки псевдонима из командной строки я использовал эту команду: git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" – jegan 9 October 2017 в 22:42
0
ответ дан Jonathan Leffler 5 November 2018 в 13:39
поделиться
44
ответ дан Mark Amery 5 November 2018 в 13:39
поделиться
28
ответ дан Peter Mortensen 5 November 2018 в 13:39
поделиться
21
ответ дан the Tin Man 5 November 2018 в 13:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: