I ran into a situation today, whereby I had created a git repository for a new dotnet application I am developing, then started committing to the repository. It was only during the review of the commit had I realised I needed to include a few more file extensions to exclude a number of extraneous files from the repository in the .gitignore file.
There were a whole host of files that I need to configure git to ignore, but unfortunately these files were already been committed to the local staging area of my git repository and had already been synced to my GitHub repository. I needed to be able to remove ignored files from git repository.
I updated my
.gitignore file with all the additional rules for the files and extensions I needed to exclude, as below. However, what I needed to do was to also remove the files I didn't want to to be included. The
.gitignore would only ensure these files and extensions would be excluded in future commits but unfortunately the files had already been committed to the repository.
## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. # User-specific files *.suo *.user *.sln.docstates # Build results [Dd]ebug/ [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ x64/ x86/ build/ bld/ [Bb]in/ [Oo]bj/ # Roslyn cache directories *.ide/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* #NUNIT *.VisualState.xml TestResult.xml # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ dlldata.c *_i.c *_p.c *_i.h *.ilk *.meta *.obj *.pch *.pdb *.pgc *.pgd *.rsp *.sbr *.tlb *.tli *.tlh *.tmp *.tmp_proj *.log *.vspscc *.vssscc .builds *.pidb *.svclog *.scc # Chutzpah Test files _Chutzpah* # Visual C++ cache files ipch/ *.aps *.ncb *.opensdf *.sdf *.cachefile # Visual Studio profiler *.psess *.vsp *.vspx # TFS 2012 Local Workspace $tf/ # Guidance Automation Toolkit *.gpState # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper *.DotSettings.user # JustCode is a .NET coding addin-in .JustCode # TeamCity is a build add-in _TeamCity* # DotCover is a Code Coverage Tool *.dotCover # NCrunch _NCrunch_* .*crunch*.local.xml # MightyMoose *.mm.* AutoTest.Net/ # Web workbench (sass) .sass-cache/ # Installshield output folder [Ee]xpress/ # DocProject is a documentation generator add-in DocProject/buildhelp/ DocProject/Help/*.HxT DocProject/Help/*.HxC DocProject/Help/*.hhc DocProject/Help/*.hhk DocProject/Help/*.hhp DocProject/Help/Html2 DocProject/Help/html # Click-Once directory publish/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml # TODO: Comment the next line if you want to checkin your web deploy settings # but database connection strings (with potential passwords) will be unencrypted *.pubxml *.publishproj # NuGet Packages *.nupkg # The packages folder can be ignored because of Package Restore **/packages/* # except build/, which is used as an MSBuild target. !**/packages/build/ # If using the old MSBuild-Integrated Package Restore, uncomment this: #!**/packages/repositories.config # Windows Azure Build Output csx/ *.build.csdef # Windows Store app package directory AppPackages/ # Others sql/ *.Cache ClientBin/ [Ss]tyle[Cc]op.* ~$* *~ *.dbmdl *.dbproj.schemaview *.pfx *.publishsettings node_modules/ # RIA/Silverlight projects Generated_Code/ # Backup & report files from converting an old project file # to a newer Visual Studio version. Backup files are not needed, # because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm # SQL Server files *.mdf *.ldf # Business Intelligence projects *.rdl.data *.bim.layout *.bim_*.settings # Microsoft Fakes FakesAssemblies/ /packages
How to remove existing files from the repository
In understanding the git promotion model we explored working directory, staging and the local repository and how they make up your typical git environment on your machine and how the Git Promotion model is a way of thinking about the different layers of Git and how content is moved between them.
The Git cache, also called the staging area or index, contains the working tree directory, including the repository, commits, and branches that would be committed the instance you call the
commit command at any point in time.
The cache helps you make selected changes to the working tree before committing them or only download the most recent commits while caching most others.
Without the Git cache, the Git commit would inconveniently revert commit changes to the working tree before committing some of the commit changes in the next commit.
How to clear your git cache
There are a number of different ways to remove any existing files that have been erroneously committed to your Git repository. All the steps require you to clear your git cache.
How to remove individual files from git cache
To remove a specific file from the Git cache, use the
git rm command followed by the specific file.
git rm --cached <filename>
For example if I wanted to delete a specific C# file from the staging area, in this case the filename is
Program.cs I could execute the command as below within our working directory.
git rm --cached Program.cs
We verify that we have successfully removed the file by checking the index of the staging directory to see if it contains our file
You can use this same command to provide a list of filenames
How to clear entire directory
We can make use of a switch on available on the rm command to recursively iterate through all the files in a given directory on remove them. We can also use a Linux short cut of
. to indicate the current directory
git rm -r --cached .
So in order to clear the cache then add the files again, in order to apply the rules in my gitignore all I needed to do in my case was execute the following commands using the Git Bash :
git rm -r --cached . git add . git commit -am "Remove ignored files and resubmitting files"
Once this was complete I had to then re-synchronize with the Github repository.
In order to clear your staging area in order to re-add your files all you need to do is the the
git rm --cached command