Для тех, кто находит это в будущем, я бы не рекомендовал использовать 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;
Вы также получаете преимущество лучшего интерфейса. С помощью
Найдите последнюю фиксацию, которая повлияла на данный путь. Поскольку файл не находится в фиксации 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"
git undelete path/to/file.ext
.bash_profile
(или другой соответствующий файл, который загружается при открытии командной оболочки): git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
git undelete path/to/file.ext
Этот псевдоним сначала проверяет, чтобы найти последнюю фиксацию, в которой находился этот файл, и выполняет ли git checkout этого пути файла от последнего коммита, где этот файл существует. Источник
В нашем случае мы случайно удалили файлы в фиксации, а некоторые совершили позже, мы поняли нашу ошибку и хотели вернуть все удаленные файлы, но не те, которые были изменены.
Основываясь на данных Чарльза Бейли отличный ответ вот мой один лайнер:
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)
Я пришел к этому вопросу, пытаясь восстановить файл, который я только что удалил, но я еще не совершил это изменение. На всякий случай, когда вы окажетесь в этой ситуации, все, что вам нужно сделать, это следующее:
git checkout HEAD -- path/to/file.ext
Если вы безумны, используйте 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 .
git bisect run '[ -e foo.bar ]'
?
– avdgaag
4 June 2009 в 23:53
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
Чтобы восстановить все эти удаленные файлы в папке, введите следующую команду:
git ls-files -d | xargs git checkout --
git
сделал даже самую простую задачу.
– jww
19 October 2013 в 05:12
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, мне нужно восстановить файлы, но затем отключить их. У меня было сотни файлов для восстановления, набрав все вручную для каждого файла, так как в других примерах было слишком медленно.
Если вы только вносили изменения и удаляли файл, но не фиксировали его, а теперь вы расстались с вашими изменениями
git checkout -- .
, но ваши удаленные файлы не возвращались, вы просто выполняете следующую команду :
git checkout <file_path>
И престо, ваш файл вернулся.
Во многих случаях полезно использовать 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
Так же, как другие
Файл будет восстановлен до состояния, которое было перед удалением. Не забудьте повторно зафиксировать его на рабочем дереве, если вы хотите его сохранить.
error: pathspec 'foo' did not match any file(s) known to git.
, я убедился, что имя файла верное. Git версия 2.7.0
– wisbucky
27 February 2016 в 02:35
git add -A
, но так, чтобы восстановленный файл все еще находился в незастроенной стадии.
– Fedir RYKHTIK
20 April 2017 в 17:08
git log --diff-filter=D --summary
для получения всех коммитов, которые удалили файлы и удалили файлы; git checkout $commit~1 filename
для восстановления удаленного файла. Где $commit
- значение фиксации, которое вы нашли на шаге 1, например e4cf499627
git log -- *PartOfMyFileName*
. Спасибо за $commit~1
– bgs
11 April 2013 в 00:25
git checkout $commit~1 filename
отлично подходит для отдельных файлов, а также работает для целых каталогов. т.е.: восстановить все удаленные изображения в ./images из шага 12345: git checkout 12345~1 images
. спасибо за этот ответ!
– noinput
3 June 2014 в 05:59
$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>”
Если вы знаете фиксацию, которая удалила файл (ы), запустите эту команду, где <SHA1_deletion>
- это фиксация, которая удалила файл:
git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --
Часть перед каналом перечисляет все файлы которые были удалены в фиксации; все они проверяются с предыдущей фиксации, чтобы восстановить их.
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
Мой новый любимый псевдоним, основанный на 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\""
restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
– void.pointer
13 March 2014 в 00:27
git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
– jegan
9 October 2017 в 22:42
error: pathspec <filename> did not match any file(s) known to git.
. Решение заключалось в использовании git bash. – donturner 26 July 2012 в 19:07git checkout <deleting-commit>~1 -- <file-path>
~ X позволяет указать X коммит до указанного коммита, поэтому ~ 1 - это фиксация до , ~ 2 - две коммиты до и т. Д. – Nils Luxton 10 September 2012 в 16:07