How to remove all files in a Git repository that are not in the working directory?

前端 未结 3 1760
半阙折子戏
半阙折子戏 2021-02-07 17:53

I\'m in the process of splitting up an old suite of applications which originally resided in a single Subversion repository.

I\'ve converted it over to a Git repository

3条回答
  •  广开言路
    2021-02-07 18:32

    Here's how you can use git filter-branch to get rid of all files that you don't want:

    1. Get a list of the filenames that you don't want to appear in the history both the old names and the new names in case of renames. For example put them in a file called toberemoved.txt

    2. Run git filter-branch like this:

      $ git filter-branch --tree-filter "rm -f `cat toberemoved.txt`" branch1 branch2 ...
      

    Here's the relevant man page from git filter-branch:

       --tree-filter 
           This is the filter for rewriting the tree and its contents. The
           argument is evaluated in shell with the working directory set to
           the root of the checked out tree. The new tree is then used as-is
           (new files are auto-added, disappeared files are auto-removed -
           neither .gitignore files nor any other ignore rules HAVE ANY
           EFFECT!).
    

    So just make sure that the list of files you want deleted are all relative to the root of the checked out tree.

    Update:

    To get the list of the files that were present in the past but not in the current working directory you can run the following. Note that you'll have to do further effort to keep the "history before renaming" of renamed files:

    $ git log --raw |awk '/^:/ { if (! printed[$6]) { print $6; printed[$6] = 1 }}'|while read f;do if [ ! -f $f ]; then echo Deleted: $f;fi;done
    

    That $6 is the name of the file that were affected in a commit in shown in the --raw mode of log.

    See the --diff-filter option to git log if you want know what happened ([D]eleted, [R]enamed, [M]odified, and so on) to each file for every commit.

    Maybe others can chime in on how to find out the previous name of a tracked file in case of renames.

提交回复
热议问题