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_dlls.bat debug
   $ ./compat/vcbuild/vcpkg_copy_dlls.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 config-list.h
   to generate the header 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!
