From d3517163a51ee5b6f23df7365c5df526dc4d65aa Mon Sep 17 00:00:00 2001 From: Adrian Kreher Date: Fri, 5 Feb 2010 15:27:20 -0600 Subject: [PATCH] git-untrack-ignored script --- git-untrack-ignored | 52 +++++++++++++++++++++++++++++++++++++++++++++ install.pl | 2 ++ 2 files changed, 54 insertions(+) create mode 100755 git-untrack-ignored diff --git a/git-untrack-ignored b/git-untrack-ignored new file mode 100755 index 0000000..9ee36c5 --- /dev/null +++ b/git-untrack-ignored @@ -0,0 +1,52 @@ +#!/usr/bin/perl -w +# moderately tested script to untrack files that are listed in .gitignore + +use strict; +use Getopt::Long; + +my $dry_run = 0; +my $help_me = 0; +GetOptions( + 'dry-run!' => \$dry_run, + 'h|help|?' => \$help_me, +); + +if ($help_me) { + print "$0: runs 'git rm --cached' for all the files in your .gitignore\n"; + print "(This makes them untracked but not deleted)\n"; + print "Options: --dry-run: just print out which files we would remove\n"; + exit; +} + +open my $fh, '<', '.gitignore' or die "Couldn't find/open .gitignore: $!"; +my @patterns = <$fh>; +close $fh; +chomp @patterns; + +apply_patterns('.', @patterns); + +sub apply_patterns { + my $dir = shift; + #print "at $dir\n"; + my @patterns = @_; + + for my $pattern (@patterns) { + if ($pattern =~ /^\s*#/ || $pattern =~ /^\s*$/) { + next; + } elsif ($pattern =~ /^\s*!/) { + print "ignoring negating pattern\n"; + } + + my @files = glob($pattern); + + for my $file (grep {-e $_} map {"$dir/$_"} @files) { + if ($dry_run) { + print "unstage $file\n"; + } else { + system('git', 'rm', '-q', '--ignore-unmatch', '--cached', $file); + } + } + } + + apply_patterns($_, @patterns) for grep {-d} glob($dir . '/*'); +} diff --git a/install.pl b/install.pl index e6f95a6..45445e2 100755 --- a/install.pl +++ b/install.pl @@ -77,6 +77,8 @@ my %links = ( caffeinate => 'bin/caffeinate', lock => 'bin/lock', + 'git-untrack-ignored' => 'bin/git-untracked-ignored', + latex => '.latex', );