Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Template .gitignore file for WordPress projects
# This is a template .gitignore file for git-managed WordPress projects.
#
# Fact: you don't want WordPress core files, or your server-specific
# configuration files etc., in your project's repository. You just don't.
#
# Solution: stick this file up your repository root (which it assumes is
# also the WordPress root directory) and add exceptions for any plugins,
# themes, and other directories that should be under version control.
#
# See the comments below for more info on how to add exceptions for your
# content. Or see git's documentation for more info on .gitignore files:
# http://kernel.org/pub/software/scm/git/docs/gitignore.html
# Ignore everything in the root except the "wp-content" directory.
/*
!.gitignore
!wp-content/
# Ignore everything in the "wp-content" directory, except the "plugins"
# and "themes" directories.
wp-content/*
!wp-content/plugins/
!wp-content/themes/
# Ignore everything in the "plugins" directory, except the plugins you
# specify (see the commented-out examples for hints on how to do this.)
wp-content/plugins/*
# !wp-content/plugins/my-single-file-plugin.php
# !wp-content/plugins/my-directory-plugin/
# Ignore everything in the "themes" directory, except the themes you
# specify (see the commented-out example for a hint on how to do this.)
wp-content/themes/*
# !wp-content/themes/my-theme/
@benklocek

This comment has been minimized.

Show comment Hide comment
@benklocek

benklocek Mar 22, 2011

The "!" exclusion feature doesn't work with git 1.5.4.1. Does with git 1.7.1.

The "!" exclusion feature doesn't work with git 1.5.4.1. Does with git 1.7.1.

@ahmednuaman

This comment has been minimized.

Show comment Hide comment
@ahmednuaman

ahmednuaman Jun 18, 2011

This is awesome, thank you!

This is awesome, thank you!

@avioli

This comment has been minimized.

Show comment Hide comment
@avioli

avioli Jul 6, 2011

By using ! to invert the exclusion includes all stuff from the path
Since I have a .DS_Store file in my theme directory, it get's included in the repo, because of the inversion.
Is there a solution?
Example (last two lines from the gist above):

wp-content/themes/*
!wp-content/themes/my-theme/

Now if I have a .DS_Store file in wp-content/themes/my-theme/ it will be included in the repo.

avioli commented Jul 6, 2011

By using ! to invert the exclusion includes all stuff from the path
Since I have a .DS_Store file in my theme directory, it get's included in the repo, because of the inversion.
Is there a solution?
Example (last two lines from the gist above):

wp-content/themes/*
!wp-content/themes/my-theme/

Now if I have a .DS_Store file in wp-content/themes/my-theme/ it will be included in the repo.

@benklocek

This comment has been minimized.

Show comment Hide comment
@benklocek

benklocek Jul 6, 2011

@avioli perhaps put your .DS_Store line after everything else?

@avioli perhaps put your .DS_Store line after everything else?

@redoPop

This comment has been minimized.

Show comment Hide comment
@redoPop

redoPop Jul 6, 2011

@avioli you may want to check that you have .DS_Store specified in your project's .gitignore file or your global .gitignore list. If you're depending on global gitignore's, it could also be that someone else who's working on your project doesn't have .DS_Store in their global .gitignore and subsequently added the .DS_Store file to the project.

Either way, the negation that re-includes your specific theme directory shouldn't override .DS_Store's exclusion.

Now that the file's been added, you'll need to manually remove it from the repository for the .gitignore to take effect again.

Owner

redoPop commented Jul 6, 2011

@avioli you may want to check that you have .DS_Store specified in your project's .gitignore file or your global .gitignore list. If you're depending on global gitignore's, it could also be that someone else who's working on your project doesn't have .DS_Store in their global .gitignore and subsequently added the .DS_Store file to the project.

Either way, the negation that re-includes your specific theme directory shouldn't override .DS_Store's exclusion.

Now that the file's been added, you'll need to manually remove it from the repository for the .gitignore to take effect again.

@redoPop

This comment has been minimized.

Show comment Hide comment
@redoPop

redoPop Jul 6, 2011

@avioli re-reading your question, it sounds as though you may be posing a hypothetical problem rather than describing one you've encountered, so I'd like to follow up with a little more explanation.

The negation that matches the .../my-theme/ path should not match .DS_Store files; even if .DS_Store is a pattern in a global .gitignore file or a pattern that appears earlier in the same file, it will remain excluded after the .../my-theme/ negation.

The reason for this is that the negation is applied to the path:

!wp-content/themes/my-theme/

This line tells git to remove the .../my-theme/ path from its list of exclusions, but the pattern doesn't use any wildcards that might apply to individual files within that path, so it won't override the earlier .DS_Store exclusion. To override file exclusions such as .DS_Store, we'd need to follow it up with:

!wp-content/themes/my-theme/*

...which would apply to all files within the .../my-theme/ path, and would therefore override the .DS_Store exclusion pattern. (So don't do it!)

Hope that helps. .gitignore patterns can be a little confusing.

(An aside: ending patterns with a slash to specify paths is relatively recent; as @benklocek pointed out, earlier versions of git don't support this.)

Owner

redoPop commented Jul 6, 2011

@avioli re-reading your question, it sounds as though you may be posing a hypothetical problem rather than describing one you've encountered, so I'd like to follow up with a little more explanation.

The negation that matches the .../my-theme/ path should not match .DS_Store files; even if .DS_Store is a pattern in a global .gitignore file or a pattern that appears earlier in the same file, it will remain excluded after the .../my-theme/ negation.

The reason for this is that the negation is applied to the path:

!wp-content/themes/my-theme/

This line tells git to remove the .../my-theme/ path from its list of exclusions, but the pattern doesn't use any wildcards that might apply to individual files within that path, so it won't override the earlier .DS_Store exclusion. To override file exclusions such as .DS_Store, we'd need to follow it up with:

!wp-content/themes/my-theme/*

...which would apply to all files within the .../my-theme/ path, and would therefore override the .DS_Store exclusion pattern. (So don't do it!)

Hope that helps. .gitignore patterns can be a little confusing.

(An aside: ending patterns with a slash to specify paths is relatively recent; as @benklocek pointed out, earlier versions of git don't support this.)

@avioli

This comment has been minimized.

Show comment Hide comment
@avioli

avioli Jul 13, 2011

@JBartlett Thank you for the clarification. I didn't have .DS_Store inside .gitignore. I thought all dot-named files/folders are excluded from the git repo by default.

avioli commented Jul 13, 2011

@JBartlett Thank you for the clarification. I didn't have .DS_Store inside .gitignore. I thought all dot-named files/folders are excluded from the git repo by default.

@ArnaudBan

This comment has been minimized.

Show comment Hide comment
@ArnaudBan

ArnaudBan Jun 12, 2012

Great gist !

I use git submodule (for plugins) and in that case you must add:

!.gitmodules

Great gist !

I use git submodule (for plugins) and in that case you must add:

!.gitmodules
@alancwoo

This comment has been minimized.

Show comment Hide comment
@alancwoo

alancwoo Oct 13, 2012

I find whenever I'm changing branches using this gitignore, my plugins disappear when I merge back into the master, has anyone else encountered this problem?

Posted a question on stackoverflow to no avail

I find whenever I'm changing branches using this gitignore, my plugins disappear when I merge back into the master, has anyone else encountered this problem?

Posted a question on stackoverflow to no avail

@pjohanneson

This comment has been minimized.

Show comment Hide comment
@pjohanneson

pjohanneson Nov 29, 2012

Hmmm... I can't seem to make the /* work -- it insists on grabbing everything. (I'm a git newbie so it's likely that I'm missing something...)

Hmmm... I can't seem to make the /* work -- it insists on grabbing everything. (I'm a git newbie so it's likely that I'm missing something...)

@pjohanneson

This comment has been minimized.

Show comment Hide comment
@pjohanneson

pjohanneson Nov 29, 2012

OK. I think I got it now. I needed to create my .gitignore file PRIOR to adding all the files using git add . . Hopefully this'll help some other newbie out there someday...

OK. I think I got it now. I needed to create my .gitignore file PRIOR to adding all the files using git add . . Hopefully this'll help some other newbie out there someday...

@benbowler

This comment has been minimized.

Show comment Hide comment
@benbowler

benbowler Jan 3, 2013

This is still really useful 2 years later!

This is still really useful 2 years later!

@ecommy

This comment has been minimized.

Show comment Hide comment
@ecommy

ecommy Jan 11, 2013

Just wanted to say a simple thank you!

ecommy commented Jan 11, 2013

Just wanted to say a simple thank you!

@mauricios

This comment has been minimized.

Show comment Hide comment
@mauricios

mauricios Feb 9, 2013

Great!, Now I can use the same directory for the clone and the rest of the code without using symlinks

Great!, Now I can use the same directory for the clone and the rest of the code without using symlinks

@togume

This comment has been minimized.

Show comment Hide comment
@togume

togume Feb 14, 2013

Like Thanks!

togume commented Feb 14, 2013

Like Thanks!

@chrishough

This comment has been minimized.

Show comment Hide comment
@chrishough

chrishough Feb 16, 2013

Thank you for this setup man, I forked it to a version that I am using for my latest project. Cheers.

Thank you for this setup man, I forked it to a version that I am using for my latest project. Cheers.

@chrisdhanaraj

This comment has been minimized.

Show comment Hide comment
@chrisdhanaraj

chrisdhanaraj Feb 21, 2013

Fantastic, thanks so much :)

Fantastic, thanks so much :)

@realph

This comment has been minimized.

Show comment Hide comment
@realph

realph Feb 26, 2013

Very nice!

realph commented Feb 26, 2013

Very nice!

@tubiz

This comment has been minimized.

Show comment Hide comment
@tubiz

tubiz Aug 28, 2013

How I exclude the README.md file.
Everything is fine whis this gists except that the README.md file isn't displaying
Thanks

tubiz commented Aug 28, 2013

How I exclude the README.md file.
Everything is fine whis this gists except that the README.md file isn't displaying
Thanks

@thedgbrt

This comment has been minimized.

Show comment Hide comment
@thedgbrt

thedgbrt Sep 10, 2013

Thank you for this contribution, saved me a lot of time :)

Thank you for this contribution, saved me a lot of time :)

@mcollinsnet

This comment has been minimized.

Show comment Hide comment
@mcollinsnet

mcollinsnet Sep 30, 2013

I am trying to implement this on a Wordpress to limit version control on plugin and theme subdirectories. How to clone the full site though to get started since most of the site is ignored? What order and steps are to be taken? I first added all files except the custom plugin and theme subdirectories but when i clone, I get an error that the directory is not empty.

I am trying to implement this on a Wordpress to limit version control on plugin and theme subdirectories. How to clone the full site though to get started since most of the site is ignored? What order and steps are to be taken? I first added all files except the custom plugin and theme subdirectories but when i clone, I get an error that the directory is not empty.

@jabes

This comment has been minimized.

Show comment Hide comment
@jabes

jabes Nov 9, 2013

I have experienced an issue where untracked files do not show in my working tree. This was caused by the trailing slashes after directories. Example:

/*
!wp-content/
wp-content/*
!wp-content/themes/
wp-content/themes/*
!wp-content/themes/theme/

Should be..

/*
!wp-content
wp-content/*
!wp-content/themes
wp-content/themes/*
!wp-content/themes/theme

jabes commented Nov 9, 2013

I have experienced an issue where untracked files do not show in my working tree. This was caused by the trailing slashes after directories. Example:

/*
!wp-content/
wp-content/*
!wp-content/themes/
wp-content/themes/*
!wp-content/themes/theme/

Should be..

/*
!wp-content
wp-content/*
!wp-content/themes
wp-content/themes/*
!wp-content/themes/theme
@hectorlorenzo

This comment has been minimized.

Show comment Hide comment
@hectorlorenzo

hectorlorenzo Dec 20, 2013

Thanks!

Thanks!

@mattsandersuk

This comment has been minimized.

Show comment Hide comment
@mattsandersuk

mattsandersuk Jan 7, 2014

Fantastic, thanks!

Fantastic, thanks!

@pafcioooo

This comment has been minimized.

Show comment Hide comment
@pafcioooo

pafcioooo Feb 3, 2014

Great example.
I have added also wp-config.php.
I am using git versioing for wp for getting updates from dev, to tst and then from tst to production, on each of these wp-config.php is different. What is your opinion?

Update: I suppose this .gitignore excludes everything in the root so it means also wp-config:-)

Great example.
I have added also wp-config.php.
I am using git versioing for wp for getting updates from dev, to tst and then from tst to production, on each of these wp-config.php is different. What is your opinion?

Update: I suppose this .gitignore excludes everything in the root so it means also wp-config:-)

@deepinsource

This comment has been minimized.

Show comment Hide comment
@deepinsource

deepinsource Feb 7, 2014

Thanks!

Thanks!

@dytra

This comment has been minimized.

Show comment Hide comment
@dytra

dytra Mar 5, 2014

brilliant

dytra commented Mar 5, 2014

brilliant

@ajlanghorn

This comment has been minimized.

Show comment Hide comment
@ajlanghorn

ajlanghorn Mar 16, 2014

👍

👍

@danielpaul

This comment has been minimized.

Show comment Hide comment
@danielpaul

danielpaul Mar 20, 2014

Thank you! :D

Thank you! :D

@triump0870

This comment has been minimized.

Show comment Hide comment
@triump0870

triump0870 Jul 17, 2014

after I deployed git init with git ignore set for wordpress I found nothing is there. Now I pissed off and want to get back those files but don't know hoe to do it. Can any one suggest how to solve this problem.

after I deployed git init with git ignore set for wordpress I found nothing is there. Now I pissed off and want to get back those files but don't know hoe to do it. Can any one suggest how to solve this problem.

@csaborio001

This comment has been minimized.

Show comment Hide comment
@csaborio001

csaborio001 Aug 20, 2014

Thank you, this is great help!

Thank you, this is great help!

@Vinoth945

This comment has been minimized.

Show comment Hide comment
@Vinoth945

Vinoth945 Oct 13, 2014

i am new to wordpress and use linux...where should i add this code...

i am new to wordpress and use linux...where should i add this code...

@iparr

This comment has been minimized.

Show comment Hide comment
@iparr

iparr Oct 20, 2014

@Vinoth945 Add it to the root of your WordPress directory, so the folder where wp-content and friends are.

iparr commented Oct 20, 2014

@Vinoth945 Add it to the root of your WordPress directory, so the folder where wp-content and friends are.

@nealfennimore

This comment has been minimized.

Show comment Hide comment
@nealfennimore

nealfennimore Mar 23, 2015

I'm using git 2.3.0 and had to do this to get the wp-content directory unignored.

/*
!.gitignore
!/wp-content/

I'm using git 2.3.0 and had to do this to get the wp-content directory unignored.

/*
!.gitignore
!/wp-content/
@andrecgro

This comment has been minimized.

Show comment Hide comment
@andrecgro

andrecgro Jul 9, 2016

awesome, great gist !

awesome, great gist !

@nmedia82

This comment has been minimized.

Show comment Hide comment
@nmedia82

nmedia82 Oct 27, 2016

Thanks man

Thanks man

@nnmous

This comment has been minimized.

Show comment Hide comment
@nnmous

nnmous Apr 20, 2017

Why you don't want WordPress core files in your project's repository?

If you have a local development environment don't you want to track the code of Wordpress? How can you then clone the code on your live server if you ignore core files?

You can see A collection of useful .gitignore templates and here is a WordPress.gitignore file.

nnmous commented Apr 20, 2017

Why you don't want WordPress core files in your project's repository?

If you have a local development environment don't you want to track the code of Wordpress? How can you then clone the code on your live server if you ignore core files?

You can see A collection of useful .gitignore templates and here is a WordPress.gitignore file.

@simohammedhttp

This comment has been minimized.

Show comment Hide comment
@simohammedhttp

simohammedhttp May 15, 2017

@jabes you are right !
I also removed the trailing slashes to get it up and running

@jabes you are right !
I also removed the trailing slashes to get it up and running

@irakligeek

This comment has been minimized.

Show comment Hide comment
@irakligeek

irakligeek Sep 14, 2017

This is what I was looking for, thanks a bunch

This is what I was looking for, thanks a bunch

@blachawk

This comment has been minimized.

Show comment Hide comment
@blachawk

blachawk Nov 9, 2017

Thank you, this was a good starting point for me to understand how to keep WP files properly controlled in a git repository.

blachawk commented Nov 9, 2017

Thank you, this was a good starting point for me to understand how to keep WP files properly controlled in a git repository.

@w7089

This comment has been minimized.

Show comment Hide comment
@w7089

w7089 Jan 8, 2018

Hi, don't understand why not to keep images in version control.

Read here that

The problem is that when you’re working with other developers, they’ll all have their own copies of the site database, so if you upload an image to your local development version and then commit it to the Git repository, the next time another developer pulls the repository they’ll have an orphaned image in their wp-content/uploads folder without an reference in their database. Not good. To avoid this we keep the entire uploads directory out of version control.

But, what is the alternative for website developed by multiple developers in parallel?
What's wrong with pushing and pulling db and code changes? Suppose that website users don't upload anything to uploads folder. So uploads folder is only read by its viewers.

Is ignoring uploads folder can be viewed as best practice and version controlling it - always a bad practice? Or each website is unique, etc...

Regards

P.S. Read somewhere that images is data, not code. So it should be treated like that and not version controlled. But then, additional procedure is needed for managing images repository somewhere else and checking if it's updated on each git pull by a developer. Moreover deploy to staging/production should be hooked on this procedure as well.
Or i miss something?

w7089 commented Jan 8, 2018

Hi, don't understand why not to keep images in version control.

Read here that

The problem is that when you’re working with other developers, they’ll all have their own copies of the site database, so if you upload an image to your local development version and then commit it to the Git repository, the next time another developer pulls the repository they’ll have an orphaned image in their wp-content/uploads folder without an reference in their database. Not good. To avoid this we keep the entire uploads directory out of version control.

But, what is the alternative for website developed by multiple developers in parallel?
What's wrong with pushing and pulling db and code changes? Suppose that website users don't upload anything to uploads folder. So uploads folder is only read by its viewers.

Is ignoring uploads folder can be viewed as best practice and version controlling it - always a bad practice? Or each website is unique, etc...

Regards

P.S. Read somewhere that images is data, not code. So it should be treated like that and not version controlled. But then, additional procedure is needed for managing images repository somewhere else and checking if it's updated on each git pull by a developer. Moreover deploy to staging/production should be hooked on this procedure as well.
Or i miss something?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment