2017-01-19 2 views
1

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

git add . 

по производству. Это вызвало размещение всех файлов в общедоступном/загружаемом пути. Когда я пробовал

git status 

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

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

git fetch --all 
git reset --hard origin/master 
git pull origin master 

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

git status 

Я вижу «Ваша ветка обновлена ​​с« origin/master »». Есть ли способ восстановить файлы из удаленной директории? Эти файлы очень важны ...

+0

Все, что вам нужно было внимательно прочитать вывод 'мерзавца status'. Он показывает, как отключить файл перед списком поэтапных файлов: * «use' »git reset HEAD ...« 'to unstage» * – axiac

+0

Достаточно ли вам получить содержимое файлов? Это легко восстановить, но вы должны сами предоставить имена файлов. – Vampire

+0

Возможный дубликат [Восстановить файлы, которые были добавлены в индекс, но затем удалены с помощью сброса git] (http://stackoverflow.com/questions/10782978/ recover-files-which-added-to-the-index-but-then-deleted-by-a-git-reset) –

ответ

1

Насколько я понимаю, git добавляет регистры своих файлов аргументов в репозиторий еще до того, как они будут совершены. Если они не совершены, то они будут собирать мусор позже. Поэтому, если вы действуете оперативно, должен быть способ восстановления файлов из репозитория.

Попробуйте запустить следующий скрипт bash в корневом каталоге вашего репозитория. Он создаст новый подкаталог recovering_lost_files, который будет содержать объекты git, которые новее, чем ваша HEAD-фиксация (и, следовательно, соответствуют git add -ed, но нефиксированным файлам). К сожалению, имена файлов не будут автоматически восстановлены.

recover_lost_files:

#!/usr/bin/env bash 

headcommit="$(git log --format=format:%H)" 
headcommitobject=".git/objects/${headcommit:0:2}/${headcommit:2}" 
mkdir recovering_lost_files 
find .git/objects/ -type f -newer "$headcommitobject"|while read -r path 
do 
    obj="${path#.git/objects/}" 
    obj="${obj/\/}" 
    git cat-file -p $obj > recovering_lost_files/$obj 
done 
+0

Спасибо! Кажется, что это работает, появилось несколько файлов в recovering_lost_files. –

Смежные вопросы