The Steps to Build Git with VS2015 or VS2017 from the command line.

1. Install the "vcpkg" open source package manager and build essential
   third-party libraries.  The steps for this have been captured in a
   set of convenience scripts.  These can be run from a stock Command
   Prompt or from an SDK bash window:

   $ cd <repo_root>
   $ ./compat/vcbuild/vcpkg_install.bat

   The vcpkg tools and all of the third-party sources will be installed
   in this folder:
      <repo_root>/compat/vcbuild/vcpkg/

   A file will be created with a set of Makefile macros pointing to a
   unified "include", "lib", and "bin" directory (release and debug) for
   all of the required packages.  This file will be included by the main
   Makefile:
      <repo_root>/compat/vcbuild/MSVC-DEFS-GEN

2. OPTIONALLY copy the third-party *.dll and *.pdb files into the repo
   root to make it easier to run and debug git.exe without having to
   manipulate your PATH.  This is especially true for debug sessions in
   Visual Studio.

   Use ONE of the following forms which should match how you want to
   compile git.exe.

   $ ./compat/vcbuild/vcpkg_copy_packages.bat debug
   $ ./compat/vcbuild/vcpkg_copy_packages.bat release

3. Build git using MSVC from an SDK bash window using one of the
   following commands:

   $ make MSVC=1
   $ make MSVC=1 DEBUG=1

================================================================

Alternatively, run `make vcxproj` and then load the generated `git.sln` in
Visual Studio. The initial build will install the vcpkg system and build the
dependencies automatically. This will take a while.

Instead of generating the `git.sln` file yourself (which requires a full Git
for Windows SDK), you may want to consider fetching the `vs/master` branch of
https://github.com/git-for-windows/git instead (which is updated automatically
via CI running `make vcxproj`). The `vs/master` branch does not require a Git
for Windows to build, but you can run the test scripts in a regular Git Bash.

Note that `make vcxproj` will automatically add and commit the generated `.sln`
and `.vcxproj` files to the repo. This is necessary to allow building a
fully-testable Git in Visual Studio, where a regular Git Bash can be used to
run the test scripts (as opposed to a full Git for Windows SDK): a number of
build targets, such as Git commands implemented as Unix shell scripts (where
`@@SHELL_PATH@@` and other placeholders are interpolated) require a full-blown
Git for Windows SDK (which is about 10x the size of a regular Git for Windows
installation).

If your plan is to open a Pull Request with Git for Windows, it is a good idea
to drop this commit before submitting.

================================================================
The Steps of Build Git with VS2008

1. You need the build environment, which contains the Git dependencies
   to be able to compile, link and run Git with MSVC.

   You can either use the binary repository:

       WWW: http://repo.or.cz/w/msvcgit.git
       Git: git clone git://repo.or.cz/msvcgit.git
       Zip: http://repo.or.cz/w/msvcgit.git?a=snapshot;h=master;sf=zip

   and call the setup_32bit_env.cmd batch script before compiling Git,
   (see repo/package README for details), or the source repository:

       WWW: http://repo.or.cz/w/gitbuild.git
       Git: git clone git://repo.or.cz/gitbuild.git
       Zip: (None, as it's a project with submodules)

   and build the support libs as instructed in that repo/package.

2. Ensure you have the msysgit environment in your path, so you have
   GNU Make, bash and perl available.

       WWW: http://repo.or.cz/w/msysgit.git
       Git: git clone git://repo.or.cz/msysgit.git
       Zip: http://repo.or.cz/w/msysgit.git?a=snapshot;h=master;sf=zip

   This environment is also needed when you use the resulting
   executables, since Git might need to run scripts which are part of
   the git operations.

3. Inside Git's directory run the command:
       make command-list.h
   to generate the command-list.h file needed to compile git.

4. Then either build Git with the GNU Make Makefile in the Git projects
   root
       make MSVC=1
   or generate Visual Studio solution/projects (.sln/.vcproj) with the
   command
       perl contrib/buildsystems/generate -g Vcproj
   and open and build the solution with the IDE
       devenv git.sln /useenv
   or build with the IDE build engine directly from the command line
       devenv git.sln /useenv /build "Release|Win32"
   The /useenv option is required, so Visual Studio picks up the
   environment variables for the support libraries required to build
   Git, which you set up in step 1.

Done!
