How to organize my Arduino projects' structure for easy source control? It's been a long time I've been looking for a good answer to this question.

Typically, any Arduino project but the simplest one will include:


The main source code file MyProject.ino
Libraries specific to the project (MyProjectLibrary1.h, MyProjectLibrary1.cpp...)
Third-party libraries (generally free open source, added manually to Arduino libraries directory)
Schematics, PCB diagrams
Documentation
...


All this makes it hard to keep the whole code and doc of one project under Source Code Management (e.g. on Subversion, Git or GitHub).

Managing source control of your project means managing the version of all files used by the project including 3rd-party libraries.

Now for a single project, I need to define a directory structure that:


Includes all project files as described above
I can entirely commit to a Source Code Management tool (including 3rd-party dependencies)
I can checkout anywhere on my hard drive and build the project from there (does it have to be a single location as imposed by Arduino IDE)
I can zip into a self-contained archive that I can send to a friend for him to build as easily as possible (no extra manual download)


What I find particularly tricky with Arduino projects is the management of external libraries dependencies. Java projects developers have maven repositories for that and that helps a lot in managing all external deps. But we don't have an equivalent system for Arduino libraries.

I would be interested to know how other Arduino project makers deal with these aspects in their own projects.

Also note that I am open to changing my development process, including my IDE (currently I use Eclipse with the Arduino plugin most of the time, and then I ensure my projects can also work directly with the Arduino IDE).
My way of organizing an arduino project is quite simple, all my project are git repositories so that there is at least the following:

project/

project.ino
Makefile



I have a preference using my favorite editor and a Makefile which I have crafted to work against most use cases (and I even improved on that one that I'm going to share soon).
For the libraries, I prefer to keep them as their own repositories and use git submodule to include them to the project. As many libraries written by the community are shared as git repositories, that's a good generic solution. Then, within the Makefile, I just have to add the libraries path I want to include in the LOCALLIBS variable.
Though, for some projects, it makes sense to encapsulate the libraries into a hardware abstraction layer library crafted for the project, then I prefer to use a path such as:

project

project.ino
Makefile
project_hal_lib

library1
library2
library3
…





Though, with arduino 1.5.x a new way to specify libraries is offered, that will offer a way to create and build arduino projects the same way we already do with pipy and virtualenv in python, i.e. you define the set of libraries you need and they get downloaded.