2017-01-19 16 views
1

私は大きな問題があります。昨日、私は開発と生産端末が横に並んで開かれていると誤解し、gitに追加された、コミットされていない、誤って削除されたファイルを回復する-hard

を生産しています。そのため、パブリック/アップロードのパスにあるすべてのファイルがステージングされました。私が試したとき

git status 

これは公開/アップロードのすべてのファイルがステージングされ、コミットする準備ができていることを示していました。しかし、私は決して決してコミットやプッシュを望んでいないので、私はこれらの変更をコミットしませんでした。プロダクションのSSHキーにはプッシュする権限がありません。クローン/プルだけです。

だから私は、リモートリポジトリからの私の新しいコード

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

を引く強制的にこれらのコマンドを実行しました。しかし、今、私はそれが公共/アップロードパスとディレクトリそれ自身内のすべてのファイルを削除したことを知ります。私がチェックしたとき

git status 

私は "あなたの支店は 'origin/master'で最新です。削除されたディレクトリからファイルを回復する方法はありますか?これらのファイルはかなり重要です...

+0

あなたがしなければならなかったすべては慎重 'Gitのstatus'の出力を読み取ることでした。 * "" '' git reset HEAD ... "'ステージを解除する "* – axiac

+0

ファイルの内容を取得するだけで十分ですか?これは簡単に復元できますが、それぞれのファイル名を自分で指定する必要があります – Vampire

+0

[インデックスに追加されたがgit resetで削除されたファイルを復元する]の可能な複製(http://stackoverflow.com/questions/10782978/リカバリファイルに追加された、インデックスに追加されたが、git-resetによって削除された) –

答えて

1

私が理解する限り、git addは、引数ファイルをコミットする前にリポジトリに登録します。彼らがコミットされていない場合、後でガベージコレクションされます。したがって、すぐに行動する場合は、リポジトリからファイルをリストアする方法が必要です。

リポジトリディレクトリのルートに次のbashスクリプトを実行してみてください。新しいサブディレクトリrecovering_lost_filesが作成されます。このサブディレクトリには、HEADコミットよりも新しいgitオブジェクトが含まれます(したがって、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にはいくつかのファイルがあります。 –

関連する問題