Hello- I created a simple shell script a while back to help people recover files that they deleted from their working directory (but had been added to the repository), which looks for unreachable blobs in the object database and places them in the working directory (either en masse, interactively, or via command-line arguments). This has been available at https://github.com/ethomson/git-recover for about a year, and in that time, someone has suggested that I propose this as part of git itself. So I thought I'd see if there's any interest in this. If there is, I'd like to get a sense of the amount of work required to make this suitable for inclusion. There are some larger pieces of work required -- at a minimum, I think this requires: - Tests -- there are none, which is fine with me but probably less fine for inclusion here. - Documentation -- the current README is below but it will need proper documentation that can be rendered into manpages, etc, by the tools. - Remove bashisms -- there are many. Again, this may not be particularly interesting, but I thought I'd send it along in case it is. Cheers- -ed ----------------------------------------------------------------------- git-recover allows you to recover some files that you've accidentally deleted from your working directory. It helps you find files that exist in the repository's object database - because you ran git add - but were never committed. Getting Started --------------- The simplest way to use git-recover is in interactive mode - simply run `git-recover -i` and it will show you all the files that you can recover and prompt you to act. Using git-recover ----------------- Running git-recover without any arguments will list all the files (git "blobs") that were recently orphaned, by their ID. (Their filename is not known.) You can examine these blobs by running `git show <objectid>`. If you find one that you want to recover, you can provide the ID as the argument to git-recover. You can specify the `--filename` option to write the file out and apply any filters that are set up in the repository. For example: git-recover 38762cf7f55934b34d179ae6a4c80cadccbb7f0a \ --filename shattered.pdf You can also specify multiple files to recover, each with an optional output filename: git-recover 38762c --filename one.txt cafebae --filename bae.txt If you want to recover _all_ the orphaned blobs in your repository, run `git-recover --all`. This will write all the orphaned files to the current working directory, so it's best to run this inside a temporary directory beneath your working directory. For example: mkdir _tmp && cd _tmp && git-recover --all By default, git-recover limits itself to recently created orphaned blobs. If you want to see _all_ orphaned files that have been created in your repository (but haven't yet been garbage collected), you can run: git-recover --full Options ------- git-recover [-a] [-i] [--full] [<id> [-f <filename>] ...] -a, --all Write all orphaned blobs to the current working directory. Each file will be named using its 40 character object ID. -i, --interactive Display information about each orphaned blob and prompt to recover it. --full List or recover all orphaned blobs, even those that are in packfiles. By default, `git-recover` will only look at loose object files, which limits it to the most recently created files. Examining packfiles may be slow, especially in large repositories. <id> The object ID (or its abbreviation) to recover. The file will be written to the current working directory and named using its 40 character object ID, unless the `-f` option is specified. -f <filename>, --filename <filename> When specified after an object ID, the file written will use this filename. In addition, any filters (for example: CRLF conversion or Git-LFS) will be run according to the `gitattributes` configuration. Edward Thomson (1): recover: restoration of deleted worktree files git-recover.sh | 311 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 311 insertions(+) create mode 100755 git-recover.sh -- 2.0.0 (libgit2)