Yesterday I was determined to write a detailed walk-trough on setting up the SVN for Magento development. After some minor frustrations I decided to let go of the SVN and make my self learn Git.
Recently guys/girls at beanstalkapp.com introduced Git support next their already great SVN hosting. As I was using beanstalkapp.com for some time now, I figured why not give it a try with Git.
My main idea for Magento related projects was this:
- Do not add entire Magento to the repository. Reason for this is that we need speed, we do not wish to wait forever on push/pull actions on Git repository. Also, when you properly build theme/extension only relevant parts of your Magento projects are these few folders/subfolders, the rest of files can always be fetched from Magento archive file.
- For the repository, add only few folders/sub-folders and files relevant to development (such as app/code/community/, app/code/local/, app/code/etc/modules/, app/design/frontend/default, skin/frontend/default/, etc…). This is where .gitignore file comes in place.
- Before you pull the repository files on local computer, dump entire Magento files/installation (from either SVN channel or from archive file) to the local folder.
- After you have dumped entire Magento to some local folder, pull the files from Git repository (overwriting the same existing local files).
And here is my sample of Git’s .gitignore file:
app/code/community/Phoenix/ app/code/core/ app/design/adminhtml/default/default/ app/design/frontend/base/ app/design/frontend/default/default/ app/design/frontend/default/blank/ app/design/frontend/default/iphone/ app/design/frontend/default/modern/ app/design/install/ app/etc/modules/Mage_All.xml app/etc/modules/Mage_Api.xml app/etc/modules/Mage_Bundle.xml app/etc/modules/Mage_Centinel.xml app/etc/modules/Mage_Compiler.xml app/etc/modules/Mage_Downloadable.xml app/etc/modules/Mage_Weee.xml app/etc/modules/Mage_Widget.xml app/etc/modules/Phoenix_Moneybookers.xml app/etc/config.xml app/etc/local.xml.additional app/etc/local.xml.template app/locale/en_US/ app/Mage.php cron.php cron.sh downloader/ errors/ favicon.ico includes/ index.php index.php.sample install.php js/blank.html js/extjs/ js/lib/ js/prototype/ js/spacer.gif js/varien/ js/calendar/ js/flash/ js/index.php js/mage/ js/scriptaculous/ js/tiny_mce/ lib/3Dsecure/ lib/flex/ lib/googlecheckout/ lib/LinLibertineFont/ lib/PEAR/ lib/Varien/ lib/Zend/ LICENSE_AFL.txt LICENSE.html LICENSE.txt media/downloadable/ media/import/ nbproject/ pear/ php.ini.sample pkginfo/ shell/abstract.php shell/compiler.php shell/indexer.php shell/log.php skin/adminhtml/default/default/ skin/frontend/base/ skin/frontend/default/blank/ skin/frontend/default/blue/ skin/frontend/default/default/ skin/frontend/default/french/ skin/frontend/default/german/ skin/frontend/default/iphone/ skin/frontend/default/modern/ skin/install/ var/ pear
With these few simple steps you ensure yourself of having minimal files in GIT repository (only those related to theme or extension development) while fetching the rest of the files from default Magento archive.
Note, using the above .gitignore file might result in missing directories in the repository. For example, you might not see the app/code/community/ folder in the repository. Reason for this is that Git (by its architectural design) does not create folders if they do not hold any content in them. To “force” the git to make all the necessary blank folders you need to place at least one file in them. I resolved the “issue” by placing blank .gitignore file to each subdirectory.
Here is the structure of my folders that get pulled into Git repository after .gitignore is in place:
.: app .gitignore js lib media shell skin structure.txt var ./app: code design etc ./app/code: community local ./app/code/community: .gitignore ./app/code/local: .gitignore ./app/design: adminhtml frontend ./app/design/adminhtml: default ./app/design/adminhtml/default: .gitignore ./app/design/frontend: default ./app/design/frontend/default: .gitignore ./app/etc: modules ./app/etc/modules: .gitignore ./js: .gitignore ./lib: .gitignore ./media: .gitignore ./shell: .gitignore ./skin: adminhtml frontend ./skin/adminhtml: default ./skin/adminhtml/default: .gitignore ./skin/frontend: default ./skin/frontend/default: .gitignore ./var:
Hope this gets helpful for some.