diff --git a/BUILD.md b/BUILD.md
deleted file mode 100644
index 539d6e3..0000000
--- a/BUILD.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# Building  Jiri
-
-## Prerequisites
-* cmake 3.7.2
-* golang 1.7.3
-* ninja 1.7.2
-* git 2.7.4
-
-## Get source
-
-### Using jiri prebuilt
-This method only works with linux (x86\_64 and aarch64 ) and darwin (x86\_64) systems.
-The bootstrap procedure requires that you have Go 1.6 or newer and Git installed and on your `PATH`. Below command will create checkout in new folder called `fuchsia`.
-```
-curl -s https://raw.githubusercontent.com/fuchsia-mirror/jiri/master/scripts/bootstrap_jiri | bash -s fuchsia
-cd fuchsia
-export PATH=`pwd`/.jiri_root/bin:$PATH
-jiri import jiri https://fuchsia.googlesource.com/manifest
-jiri update
-```
-### Manually
-Create a root folder called `fuchsia`, then use git to manually clone each of the projects mentioned in this [manifest][jiri manifest], put them in correct paths and checkout required revisions. `HEAD` should be on `origin/master` where no revision is mentioned in manifest.
-
-## Build
-Set GOPATH to `fuchsia/go`, cd into `fuchsia/go/src/fuchsia.googlesource.com/jiri` and run
-```
-./scripts/build.sh
-```
-
-The above command should build jiri and put it into your jiri repo root.
-
-## Running the tests
-To run jiri's tests, run the following from the `fuchsia/go` directory:
-```
-export GOPATH=$(pwd)
-go test $(go list fuchsia.googlesource.com/jiri/... 2>/dev/null | grep -v /jiri/vendor/)
-```
-
-(The use of `grep` here excludes tests from packages below `src/fuchsia.googlesource.com/jiri/vendor/` which don't pass.)
-
-## Known Issues
-
-If build complains about undefined `http_parser_*` functions, please remove `http_parser` from your library path.
-
-[jiri manifest]: https://fuchsia.googlesource.com/manifest/+/refs/heads/master/jiri "jiri manifest"
diff --git a/cmd/jiri/branch.go b/cmd/jiri/branch.go
index 024adf2..9d8133b 100644
--- a/cmd/jiri/branch.go
+++ b/cmd/jiri/branch.go
@@ -17,7 +17,6 @@
 	"fuchsia.googlesource.com/jiri"
 	"fuchsia.googlesource.com/jiri/cmdline"
 	"fuchsia.googlesource.com/jiri/gerrit"
-	"fuchsia.googlesource.com/jiri/git"
 	"fuchsia.googlesource.com/jiri/gitutil"
 	"fuchsia.googlesource.com/jiri/project"
 )
@@ -271,8 +270,7 @@
 	}
 	gerrit := gerrit.New(jirix, hostUrl)
 	scm := gitutil.New(jirix, gitutil.RootDirOpt(local.Path))
-	g := git.NewGit(local.Path)
-	branches, err := g.GetAllBranchesInfo()
+	branches, err := scm.GetAllBranchesInfo()
 	if err != nil {
 		retErr = append(retErr, err)
 		return nil, retErr
@@ -287,12 +285,12 @@
 			return nil, nil
 		}
 		if b.IsHead {
-			untracked, err := g.HasUntrackedFiles()
+			untracked, err := scm.HasUntrackedFiles()
 			if err != nil {
 				retErr = append(retErr, fmt.Errorf("Not deleting current branch %q as can't get changes: %s\n", b.Name, err))
 				continue
 			}
-			uncommited, err := g.HasUncommittedChanges()
+			uncommited, err := scm.HasUncommittedChanges()
 			if err != nil {
 				retErr = append(retErr, fmt.Errorf("Not deleting current branch %q as can't get changes: %s\n", b.Name, err))
 				continue
@@ -328,7 +326,7 @@
 		deleteBranch := true
 		for _, c := range extraCommits {
 			deleteBranch = false
-			log, err := g.CommitMsg(c)
+			log, err := scm.CommitMsg(c)
 			if err != nil {
 				retErr = append(retErr, fmt.Errorf("Not deleting branch %q as can't get log for rev %q: %s\n", b.Name, c, err))
 				break
@@ -365,7 +363,7 @@
 			}
 		}
 
-		shortHash, err := g.ShortHash(b.Revision)
+		shortHash, err := scm.ShortHash(b.Revision)
 		if err != nil {
 			retErr = append(retErr, fmt.Errorf("Not deleting current branch %q as can't short hash: %s\n", b.Name, err))
 			continue
@@ -389,8 +387,7 @@
 	var retErr MultiError
 	var mergedBranches map[string]bool
 	scm := gitutil.New(jirix, gitutil.RootDirOpt(local.Path))
-	g := git.NewGit(local.Path)
-	branches, err := g.GetAllBranchesInfo()
+	branches, err := scm.GetAllBranchesInfo()
 	if err != nil {
 		retErr = append(retErr, err)
 		return nil, retErr
@@ -410,7 +407,7 @@
 				if rb == "" {
 					rb = "master"
 				}
-				if mbs, err := g.MergedBranches("remotes/origin/" + rb); err != nil {
+				if mbs, err := scm.MergedBranches("remotes/origin/" + rb); err != nil {
 					retErr = append(retErr, fmt.Errorf("Not able to get merged un-tracked branches: %s\n", err))
 					continue
 				} else {
@@ -426,12 +423,12 @@
 		}
 
 		if b.IsHead {
-			untracked, err := g.HasUntrackedFiles()
+			untracked, err := scm.HasUntrackedFiles()
 			if err != nil {
 				retErr = append(retErr, fmt.Errorf("Not deleting current branch %q as can't get changes: %s\n", b.Name, err))
 				continue
 			}
-			uncommited, err := g.HasUncommittedChanges()
+			uncommited, err := scm.HasUncommittedChanges()
 			if err != nil {
 				retErr = append(retErr, fmt.Errorf("Not deleting current branch %q as can't get changes: %s\n", b.Name, err))
 				continue
@@ -451,7 +448,7 @@
 			}
 		}
 
-		shortHash, err := g.ShortHash(b.Revision)
+		shortHash, err := scm.ShortHash(b.Revision)
 		if err != nil {
 			retErr = append(retErr, fmt.Errorf("Not deleting current branch %q as can't short hash: %s\n", b.Name, err))
 			continue
@@ -515,7 +512,7 @@
 					errors = true
 					fmt.Printf(jirix.Color.Red("Error while deleting branch: %s\n", err))
 				} else {
-					shortHash, err := scm.GetShortHash(branch.Revision)
+					shortHash, err := scm.ShortHash(branch.Revision)
 					if err != nil {
 						return err
 					}
diff --git a/cmd/jiri/patch.go b/cmd/jiri/patch.go
index bfce8a8..0f857d8 100644
--- a/cmd/jiri/patch.go
+++ b/cmd/jiri/patch.go
@@ -14,7 +14,6 @@
 	"fuchsia.googlesource.com/jiri"
 	"fuchsia.googlesource.com/jiri/cmdline"
 	"fuchsia.googlesource.com/jiri/gerrit"
-	"fuchsia.googlesource.com/jiri/git"
 	"fuchsia.googlesource.com/jiri/gitutil"
 	"fuchsia.googlesource.com/jiri/project"
 )
@@ -73,7 +72,6 @@
 // patchProject checks out the given change.
 func patchProject(jirix *jiri.X, local project.Project, ref, branch, remote string) (bool, error) {
 	scm := gitutil.New(jirix, gitutil.RootDirOpt(local.Path))
-	g := git.NewGit(local.Path)
 	if !detachedHeadFlag {
 		if branch == "" {
 			cl, ps, err := gerrit.ParseRefString(ref)
@@ -83,13 +81,13 @@
 			branch = fmt.Sprintf("change/%v/%v", cl, ps)
 		}
 		jirix.Logger.Infof("Patching project %s(%s) on branch %q to ref %q\n", local.Name, local.Path, branch, ref)
-		branchExists, err := g.BranchExists(branch)
+		branchExists, err := scm.BranchExists(branch)
 		if err != nil {
 			return false, err
 		}
 		if branchExists {
 			if patchDeleteFlag {
-				_, currentBranch, err := g.GetBranches()
+				_, currentBranch, err := scm.GetBranches()
 				if err != nil {
 					return false, err
 				}
@@ -129,10 +127,10 @@
 		branchBase = "HEAD"
 	}
 	if !detachedHeadFlag {
-		if err := g.CreateBranchFromRef(branch, branchBase); err != nil {
+		if err := scm.CreateBranchFromRef(branch, branchBase); err != nil {
 			return false, err
 		}
-		if err := g.SetUpstream(branch, "origin/"+remote); err != nil {
+		if err := scm.SetUpstream(branch, "origin/"+remote); err != nil {
 			return false, fmt.Errorf("setting upstream to 'origin/%s': %s", remote, err)
 		}
 		if err := scm.CheckoutBranch(branch); err != nil {
@@ -174,12 +172,13 @@
 // rebaseProject rebases the current branch on top of a given branch.
 func rebaseProject(jirix *jiri.X, project project.Project, remoteBranch string) error {
 	jirix.Logger.Infof("Rebasing project %s(%s)\n", project.Name, project.Path)
-	g := git.NewGit(project.Path)
-	name, email, err := g.UserInfoForCommit("HEAD")
+	scm := gitutil.New(jirix, gitutil.RootDirOpt(project.Path))
+	name, email, err := scm.UserInfoForCommit("HEAD")
 	if err != nil {
 		return fmt.Errorf("Rebase: cannot get user info for HEAD: %s", err)
 	}
-	scm := gitutil.New(jirix, gitutil.UserNameOpt(name), gitutil.UserEmailOpt(email), gitutil.RootDirOpt(project.Path))
+	// TODO: provide a way to set username and email
+	scm = gitutil.New(jirix, gitutil.UserNameOpt(name), gitutil.UserEmailOpt(email), gitutil.RootDirOpt(project.Path))
 	if err := scm.FetchRefspec("origin", remoteBranch); err != nil {
 		jirix.Logger.Errorf("Not able to fetch branch %q: %s", remoteBranch, err)
 		jirix.IncrementFailures()
diff --git a/cmd/jiri/source_manifest_test.go b/cmd/jiri/source_manifest_test.go
index 69c6a43..8e77f22 100644
--- a/cmd/jiri/source_manifest_test.go
+++ b/cmd/jiri/source_manifest_test.go
@@ -13,7 +13,6 @@
 	"path/filepath"
 	"testing"
 
-	"fuchsia.googlesource.com/jiri/git"
 	"fuchsia.googlesource.com/jiri/gitutil"
 	"fuchsia.googlesource.com/jiri/jiritest"
 	"fuchsia.googlesource.com/jiri/project"
@@ -68,8 +67,8 @@
 	}
 	revMap := make(map[string]string)
 	for _, path := range paths {
-		g := git.NewGit(filepath.Join(fake.X.Root, path))
-		if rev, err := g.CurrentRevision(); err != nil {
+		scm := gitutil.New(fake.X, gitutil.RootDirOpt(filepath.Join(fake.X.Root, path)))
+		if rev, err := scm.CurrentRevision(); err != nil {
 			t.Fatal(err)
 		} else {
 			revMap[path] = rev
diff --git a/cmd/jiri/status.go b/cmd/jiri/status.go
index 8b5dae1..3c5f6dc 100644
--- a/cmd/jiri/status.go
+++ b/cmd/jiri/status.go
@@ -13,7 +13,6 @@
 
 	"fuchsia.googlesource.com/jiri"
 	"fuchsia.googlesource.com/jiri/cmdline"
-	"fuchsia.googlesource.com/jiri/git"
 	"fuchsia.googlesource.com/jiri/gitutil"
 	"fuchsia.googlesource.com/jiri/project"
 )
@@ -182,7 +181,6 @@
 	headRev := ""
 	changes := ""
 	scm := gitutil.New(jirix, gitutil.RootDirOpt(local.Path))
-	g := git.NewGit(local.Path)
 	var err error
 	if statusFlags.changes {
 		changes, err = scm.ShortStatus()
@@ -192,14 +190,14 @@
 	}
 	if statusFlags.checkHead && remote.Name != "" {
 		// try getting JIRI_HEAD first
-		if r, err := g.CurrentRevisionForRef("JIRI_HEAD"); err == nil {
+		if r, err := scm.CurrentRevisionForRef("JIRI_HEAD"); err == nil {
 			headRev = r
 		} else {
 			headRev, err = project.GetHeadRevision(jirix, remote)
 			if err != nil {
 				return "", "", nil, err
 			}
-			if r, err := g.CurrentRevisionForRef(headRev); err != nil {
+			if r, err := scm.CurrentRevisionForRef(headRev); err != nil {
 				return "", "", nil, fmt.Errorf("Cannot find revision for ref %q for project %q: %s", headRev, local.Name, err)
 			} else {
 				headRev = r
diff --git a/cmd/jiri/status_test.go b/cmd/jiri/status_test.go
index a9792c5..9cbc981 100644
--- a/cmd/jiri/status_test.go
+++ b/cmd/jiri/status_test.go
@@ -15,7 +15,6 @@
 	"testing"
 
 	"fuchsia.googlesource.com/jiri"
-	"fuchsia.googlesource.com/jiri/git"
 	"fuchsia.googlesource.com/jiri/gitutil"
 	"fuchsia.googlesource.com/jiri/jiritest"
 	"fuchsia.googlesource.com/jiri/project"
@@ -40,20 +39,19 @@
 	var relativePaths []string
 	for i, localProject := range localProjects {
 		setDummyUser(t, fake.X, fake.Projects[localProject.Name])
-		gr := git.NewGit(fake.Projects[localProject.Name])
 		gitRemote := gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[localProject.Name]))
 		writeFile(t, fake.X, fake.Projects[localProject.Name], "file1"+strconv.Itoa(i), "file1"+strconv.Itoa(i))
 		gitRemote.CreateAndCheckoutBranch("file-1")
 		gitRemote.CheckoutBranch("master")
-		file1CommitRev, _ := gr.CurrentRevision()
+		file1CommitRev, _ := gitRemote.CurrentRevision()
 		file1CommitRevs = append(file1CommitRevs, file1CommitRev)
 		gitRemote.CreateAndCheckoutBranch("file-2")
 		gitRemote.CheckoutBranch("master")
 		writeFile(t, fake.X, fake.Projects[localProject.Name], "file2"+strconv.Itoa(i), "file2"+strconv.Itoa(i))
-		file2CommitRev, _ := gr.CurrentRevision()
+		file2CommitRev, _ := gitRemote.CurrentRevision()
 		file2CommitRevs = append(file2CommitRevs, file2CommitRev)
 		writeFile(t, fake.X, fake.Projects[localProject.Name], "file3"+strconv.Itoa(i), "file3"+strconv.Itoa(i))
-		file3CommitRev, _ := gr.CurrentRevision()
+		file3CommitRev, _ := gitRemote.CurrentRevision()
 		latestCommitRevs = append(latestCommitRevs, file3CommitRev)
 		relativePath, _ := filepath.Rel(cwd, localProject.Path)
 		relativePaths = append(relativePaths, relativePath)
@@ -300,7 +298,7 @@
 		}
 		extraCommits5 = append([]string{log}, extraCommits5...)
 	}
-	gl5 := git.NewGit(localProjects[5].Path)
+	gl5 := gitutil.New(fake.X, gitutil.RootDirOpt(localProjects[5].Path))
 	currentCommit5, err := gl5.CurrentRevision()
 	if err != nil {
 		t.Error(err)
diff --git a/cmd/jiri/upload.go b/cmd/jiri/upload.go
index d8dff63..fc28074 100644
--- a/cmd/jiri/upload.go
+++ b/cmd/jiri/upload.go
@@ -13,7 +13,6 @@
 	"fuchsia.googlesource.com/jiri"
 	"fuchsia.googlesource.com/jiri/cmdline"
 	"fuchsia.googlesource.com/jiri/gerrit"
-	"fuchsia.googlesource.com/jiri/git"
 	"fuchsia.googlesource.com/jiri/gitutil"
 	"fuchsia.googlesource.com/jiri/project"
 )
@@ -184,7 +183,7 @@
 			relativePath = project.Path
 		}
 		if uploadRebaseFlag {
-			if changes, err := git.NewGit(project.Path).HasUncommittedChanges(); err != nil {
+			if changes, err := gitutil.New(jirix, gitutil.RootDirOpt(project.Path)).HasUncommittedChanges(); err != nil {
 				return err
 			} else if changes {
 				return fmt.Errorf("Project %s(%s) has uncommited changes, please commit them or stash them. Cannot rebase before pushing.", project.Name, relativePath)
diff --git a/git/git.go b/git/git.go
deleted file mode 100644
index 9b28244..0000000
--- a/git/git.go
+++ /dev/null
@@ -1,456 +0,0 @@
-// Copyright 2017 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package git
-
-import (
-	"fmt"
-
-	git2go "github.com/libgit2/git2go"
-)
-
-type Git struct {
-	rootDir string
-}
-
-func NewGit(path string) *Git {
-	return &Git{
-		rootDir: path,
-	}
-}
-
-func (g *Git) CurrentRevisionRaw() ([]byte, error) {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return nil, err
-	}
-	defer repo.Free()
-	head, err := repo.Head()
-	if err != nil {
-		return nil, err
-	}
-	defer head.Free()
-	return head.Target()[:], nil
-}
-
-func (g *Git) CurrentRevision() (string, error) {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return "", err
-	}
-	defer repo.Free()
-	head, err := repo.Head()
-	if err != nil {
-		return "", err
-	}
-	defer head.Free()
-	return head.Target().String(), nil
-}
-
-// BranchExists tests whether a branch with the given name exists in
-// the local repository.
-func (g *Git) BranchExists(branch string) (bool, error) {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return false, err
-	}
-	defer repo.Free()
-	if _, err := repo.LookupBranch(branch, git2go.BranchAll); err != nil {
-		return false, nil
-	}
-	return true, nil
-}
-
-func (g *Git) CommitMsg(ref string) (string, error) {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return "", err
-	}
-	defer repo.Free()
-	obj, err := repo.RevparseSingle(ref)
-	if err != nil {
-		return "", err
-	}
-	defer obj.Free()
-	c, err := obj.Peel(git2go.ObjectCommit)
-	if err != nil {
-		return "", err
-	}
-	defer c.Free()
-	commit, err := c.AsCommit()
-	if err != nil {
-		return "", err
-	}
-	return commit.Message(), nil
-}
-
-// Fetch fetches refs and tags from the given remote.
-func (g *Git) Fetch(remote string, opts ...FetchOpt) error {
-	return g.FetchRefspec(remote, "", opts...)
-}
-
-func (g *Git) CreateLightweightTag(name string) error {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return err
-	}
-	defer repo.Free()
-	head, err := repo.Head()
-	if err != nil {
-		return err
-	}
-	defer head.Free()
-	c, err := repo.LookupCommit(head.Target())
-	if err != nil {
-		return err
-	}
-	_, err = repo.Tags.CreateLightweight(name, c, false)
-	return err
-}
-
-// FetchRefspec fetches refs and tags from the given remote for a particular refspec.
-func (g *Git) FetchRefspec(remoteName, refspec string, opts ...FetchOpt) error {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return err
-	}
-	defer repo.Free()
-	if remoteName == "" {
-		return fmt.Errorf("No remote passed")
-	}
-	remote, err := repo.Remotes.Lookup(remoteName)
-	if err != nil {
-		return err
-	}
-	defer remote.Free()
-	fetchOptions := &git2go.FetchOptions{}
-	tags := false
-	prune := false
-	for _, opt := range opts {
-		switch typedOpt := opt.(type) {
-		case TagsOpt:
-			tags = bool(typedOpt)
-		case PruneOpt:
-			prune = bool(typedOpt)
-		}
-	}
-	refspecList := []string{}
-	if refspec != "" {
-		refspecList = []string{refspec}
-	}
-	if prune {
-		fetchOptions.Prune = git2go.FetchPruneOn
-	}
-	if tags {
-		fetchOptions.DownloadTags = git2go.DownloadTagsAll
-	}
-	return remote.Fetch(refspecList, fetchOptions, "")
-}
-
-func (g *Git) SetRemoteUrl(remote, url string) error {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return err
-	}
-	defer repo.Free()
-	return repo.Remotes.SetUrl(remote, url)
-}
-
-type Reference struct {
-	Name     string
-	Revision string
-	IsHead   bool
-}
-
-type Branch struct {
-	*Reference
-	Tracking *Reference
-}
-
-func (g *Git) ShortHash(ref string) (string, error) {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return "", err
-	}
-	defer repo.Free()
-	if obj, err := repo.RevparseSingle(ref); err != nil {
-		return "", err
-	} else {
-		defer obj.Free()
-		commit, err := obj.Peel(git2go.ObjectCommit)
-		if err != nil {
-			return "", err
-		}
-		return commit.ShortId()
-	}
-}
-
-func (g *Git) UserInfoForCommit(ref string) (string, string, error) {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return "", "", err
-	}
-	defer repo.Free()
-	obj, err := repo.RevparseSingle(ref)
-	if err != nil {
-		return "", "", err
-	}
-	defer obj.Free()
-	c, err := obj.Peel(git2go.ObjectCommit)
-	if err != nil {
-		return "", "", err
-	}
-	defer c.Free()
-	commit, err := c.AsCommit()
-	if err != nil {
-		return "", "", err
-	}
-	defer commit.Free()
-	return commit.Committer().Name, commit.Committer().Email, nil
-}
-
-// CurrentRevisionForRef gets current rev for ref/branch/tags
-func (g *Git) CurrentRevisionForRef(ref string) (string, error) {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return "", err
-	}
-	defer repo.Free()
-	if obj, err := repo.RevparseSingle(ref); err != nil {
-		return "", err
-	} else {
-		defer obj.Free()
-		if obj.Type() == git2go.ObjectTag {
-			tag, err := obj.AsTag()
-			if err != nil {
-				return "", err
-			}
-			defer tag.Free()
-			return tag.TargetId().String(), nil
-		}
-		return obj.Id().String(), nil
-	}
-}
-
-func (g *Git) MergedBranches(ref string) ([]string, error) {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return nil, err
-	}
-	defer repo.Free()
-	obj, err := repo.RevparseSingle(ref)
-	if err != nil {
-		return nil, err
-	}
-	defer obj.Free()
-	baseCommit, err := obj.Peel(git2go.ObjectCommit)
-	if err != nil {
-		return nil, err
-	}
-	bi, err := repo.NewBranchIterator(git2go.BranchLocal)
-	if err != nil {
-		return nil, err
-	}
-	mergedBranches := []string{}
-	err = bi.ForEach(func(b *git2go.Branch, bt git2go.BranchType) error {
-		c := b.Target()
-		if c == nil {
-			// Ignore this branch
-			return nil
-		}
-		if base, err := repo.MergeBase(c, baseCommit.Id()); err != nil {
-			return err
-		} else if base.String() == c.String() {
-			name, err := b.Name()
-			if err != nil {
-				return err
-			}
-			mergedBranches = append(mergedBranches, name)
-		}
-		return nil
-	})
-	return mergedBranches, err
-}
-
-func (g *Git) SetUpstream(branch, upstream string) error {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return err
-	}
-	defer repo.Free()
-	b, err := repo.LookupBranch(branch, git2go.BranchLocal)
-	if err != nil {
-		return err
-	}
-	return b.SetUpstream(upstream)
-}
-
-func (g *Git) CreateBranchFromRef(branch, ref string) error {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return err
-	}
-	defer repo.Free()
-	obj, err := repo.RevparseSingle(ref)
-	if err != nil {
-		return err
-	}
-	defer obj.Free()
-	c, err := obj.Peel(git2go.ObjectCommit)
-	if err != nil {
-		return err
-	}
-	defer c.Free()
-	commit, err := c.AsCommit()
-	if err != nil {
-		return err
-	}
-	defer commit.Free()
-	_, err = repo.CreateBranch(branch, commit, false)
-	return err
-}
-
-func (g *Git) HasUntrackedFiles() (bool, error) {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return false, err
-	}
-	defer repo.Free()
-	opts := &git2go.StatusOptions{}
-	opts.Show = git2go.StatusShowIndexAndWorkdir
-	opts.Flags = git2go.StatusOptIncludeUntracked
-
-	statusList, err := repo.StatusList(opts)
-	if err != nil {
-		return false, err
-	}
-
-	defer statusList.Free()
-	entryCount, err := statusList.EntryCount()
-	if err != nil {
-		return false, err
-	}
-	for i := 0; i < entryCount; i++ {
-		entry, err := statusList.ByIndex(i)
-		if err != nil {
-			return false, err
-		}
-		if (entry.Status & git2go.StatusWtNew) > 0 {
-			return true, nil
-		}
-	}
-	return false, nil
-}
-func (g *Git) HasUncommittedChanges() (bool, error) {
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return false, err
-	}
-	defer repo.Free()
-	opts := &git2go.StatusOptions{}
-	opts.Show = git2go.StatusShowIndexAndWorkdir
-
-	statusList, err := repo.StatusList(opts)
-	if err != nil {
-		return false, err
-	}
-
-	defer statusList.Free()
-	entryCount, err := statusList.EntryCount()
-	if err != nil {
-		return false, err
-	}
-	uncommitedFlag := git2go.StatusWtModified | git2go.StatusWtDeleted |
-		git2go.StatusWtTypeChange | git2go.StatusIndexModified |
-		git2go.StatusIndexNew | git2go.StatusIndexDeleted |
-		git2go.StatusIndexTypeChange | git2go.StatusConflicted
-
-	for i := 0; i < entryCount; i++ {
-		entry, err := statusList.ByIndex(i)
-		if err != nil {
-			return false, err
-		}
-		if (entry.Status & uncommitedFlag) > 0 {
-			return true, nil
-		}
-	}
-	return false, nil
-}
-
-// GetBranches returns a slice of the local branches of the current
-// repository, followed by the name of the current branch.
-func (g *Git) GetBranches() ([]string, string, error) {
-	branches, current := []string{}, ""
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return nil, "", err
-	}
-	defer repo.Free()
-	bi, err := repo.NewBranchIterator(git2go.BranchLocal)
-	if err != nil {
-		return nil, "", err
-	}
-	err = bi.ForEach(func(b *git2go.Branch, bt git2go.BranchType) error {
-		isHead, err := b.IsHead()
-		if err != nil {
-			return err
-		}
-		name, err := b.Name()
-		if err != nil {
-			return err
-		}
-		branches = append(branches, name)
-		if isHead {
-			current = name
-		}
-		return nil
-	})
-	return branches, current, nil
-}
-
-func (g *Git) GetAllBranchesInfo() ([]Branch, error) {
-	var branches []Branch
-	repo, err := git2go.OpenRepository(g.rootDir)
-	if err != nil {
-		return nil, err
-	}
-	defer repo.Free()
-	bi, err := repo.NewBranchIterator(git2go.BranchLocal)
-	if err != nil {
-		return nil, err
-	}
-	err = bi.ForEach(func(b *git2go.Branch, bt git2go.BranchType) error {
-		isHead, err := b.IsHead()
-		if err != nil {
-			return err
-		}
-		name, err := b.Name()
-		if err != nil {
-			return err
-		}
-		revision := ""
-		if t := b.Target(); t != nil {
-			revision = t.String()
-		}
-		branch := Branch{
-			&Reference{
-				Name:     name,
-				Revision: revision,
-				IsHead:   isHead,
-			}, nil,
-		}
-		if u, err := b.Upstream(); err != nil && !git2go.IsErrorCode(err, git2go.ErrNotFound) {
-			return err
-		} else if u != nil {
-			defer u.Free()
-			branch.Tracking = &Reference{
-				Name:     u.Shorthand(),
-				Revision: u.Target().String(),
-			}
-		}
-		branches = append(branches, branch)
-		return nil
-	})
-	return branches, err
-}
diff --git a/git/options.go b/git/options.go
deleted file mode 100644
index 0c770ad..0000000
--- a/git/options.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package git
-
-type FetchOpt interface {
-	fetchOpt()
-}
-
-type TagsOpt bool
-
-func (TagsOpt) fetchOpt() {}
-
-type PruneOpt bool
-
-func (PruneOpt) fetchOpt() {}
diff --git a/gitutil/git.go b/gitutil/git.go
index fe0e07c..c20d94e 100644
--- a/gitutil/git.go
+++ b/gitutil/git.go
@@ -69,7 +69,17 @@
 func (UserNameOpt) gitOpt()      {}
 func (UserEmailOpt) gitOpt()     {}
 
-type TrackingBranch string
+type Reference struct {
+	Name     string
+	Revision string
+	IsHead   bool
+}
+
+type Branch struct {
+	*Reference
+	Tracking *Reference
+}
+
 type Revision string
 type BranchName string
 
@@ -143,6 +153,51 @@
 	return true, nil
 }
 
+// GetAllBranchesInfo returns information about all branches.
+func (g *Git) GetAllBranchesInfo() ([]Branch, error) {
+	branchesInfo, err := g.runOutput("for-each-ref", "--format", "%(refname:short):%(upstream:short):%(objectname):%(HEAD):%(upstream)", "refs/heads")
+	if err != nil {
+		return nil, err
+	}
+	var upstreamRefs []string
+	var branches []Branch
+	for _, branchInfo := range branchesInfo {
+		s := strings.SplitN(branchInfo, ":", 5)
+		branch := Branch{
+			&Reference{
+				Name:     s[0],
+				Revision: s[2],
+				IsHead:   s[3] == "*",
+			},
+			nil,
+		}
+		if s[1] != "" {
+			upstreamRefs = append(upstreamRefs, s[4])
+		}
+		branches = append(branches, branch)
+	}
+
+	args := append([]string{"show-ref"}, upstreamRefs...)
+	if refsInfo, err := g.runOutput(args...); err == nil {
+		refs := map[string]string{}
+		for _, info := range refsInfo {
+			strs := strings.SplitN(info, " ", 2)
+			refs[strs[1]] = strs[0]
+		}
+		for i, branchInfo := range branchesInfo {
+			s := strings.SplitN(branchInfo, ":", 5)
+			if s[1] != "" {
+				branches[i].Tracking = &Reference{
+					Name:     s[1],
+					Revision: refs[s[4]],
+				}
+			}
+		}
+	}
+
+	return branches, nil
+}
+
 // CheckoutBranch checks out the given branch.
 func (g *Git) CheckoutBranch(branch string, opts ...CheckoutOpt) error {
 	args := []string{"checkout"}
@@ -329,16 +384,23 @@
 	return g.run("branch", branch)
 }
 
+// CreateBranchFromRef creates a new branch from an existing reference.
+func (g *Git) CreateBranchFromRef(branch, ref string) error {
+	return g.run("branch", branch, ref)
+}
+
 // CreateAndCheckoutBranch creates a new branch with the given name
 // and checks it out.
 func (g *Git) CreateAndCheckoutBranch(branch string) error {
 	return g.run("checkout", "-b", branch)
 }
 
+// SetUpstream sets the upstream branch to the given one.
 func (g *Git) SetUpstream(branch, upstream string) error {
 	return g.run("branch", "-u", upstream, branch)
 }
 
+// LsRemote lists referneces in a remote repository.
 func (g *Git) LsRemote(args ...string) (string, error) {
 	a := []string{"ls-remote"}
 	a = append(a, args...)
@@ -358,8 +420,9 @@
 	return g.run("branch", branch, upstream)
 }
 
-func (g *Git) GetShortHash(hash string) (string, error) {
-	out, err := g.runOutput("rev-parse", "--short", hash)
+// ShortHash returns the short hash for a given reference.
+func (g *Git) ShortHash(ref string) (string, error) {
+	out, err := g.runOutput("rev-parse", "--short", ref)
 	if err != nil {
 		return "", err
 	}
@@ -369,6 +432,16 @@
 	return out[0], nil
 }
 
+// UserInfoForCommit returns user name and email for a given reference.
+func (g *Git) UserInfoForCommit(ref string) (string, string, error) {
+	out, err := g.runOutput("log", "-n", "1", "--format=format:%cn:%ce", ref)
+	if err != nil {
+		return "", "", err
+	}
+	info := strings.SplitN(out[0], ":", 2)
+	return info[0], info[1], nil
+}
+
 // CurrentBranchName returns the name of the current branch.
 func (g *Git) CurrentBranchName() (string, error) {
 	out, err := g.runOutput("rev-parse", "--abbrev-ref", "HEAD")
@@ -451,6 +524,36 @@
 	return err == nil
 }
 
+// CurrentRevision returns the current revision.
+func (g *Git) CurrentRevision() (string, error) {
+	return g.CurrentRevisionForRef("HEAD")
+}
+
+// CurrentRevisionForRef gets current rev for ref/branch/tags
+func (g *Git) CurrentRevisionForRef(ref string) (string, error) {
+	out, err := g.runOutput("rev-parse", ref)
+	if err != nil {
+		return "", err
+	}
+	if got, want := len(out), 1; got != want {
+		return "", fmt.Errorf("unexpected length of %v: got %v, want %v", out, got, want)
+	}
+	return out[0], nil
+}
+
+// CurrentRevisionOfBranch returns the current revision of the given branch.
+func (g *Git) CurrentRevisionOfBranch(branch string) (string, error) {
+	// Using rev-list instead of rev-parse as latter doesn't work well with tag
+	out, err := g.runOutput("rev-list", "-n", "1", branch)
+	if err != nil {
+		return "", err
+	}
+	if got, want := len(out), 1; got != want {
+		return "", fmt.Errorf("unexpected length of %v: got %v, want %v", out, got, want)
+	}
+	return out[0], nil
+}
+
 func (g *Git) CherryPick(rev string) error {
 	err := g.run("cherry-pick", rev)
 	return err
@@ -488,6 +591,11 @@
 	return g.run(args...) == nil
 }
 
+// CreateLightweightTag creates a lightweight tag with a given name.
+func (g *Git) CreateLightweightTag(name string) error {
+	return g.run("tag", name)
+}
+
 // Fetch fetches refs and tags from the given remote.
 func (g *Git) Fetch(remote string, opts ...FetchOpt) error {
 	return g.FetchRefspec(remote, "", opts...)
@@ -561,6 +669,12 @@
 	return append(out, out2...), nil
 }
 
+// MergedBranches returns the list of all branches that were already merged.
+func (g *Git) MergedBranches(ref string) ([]string, error) {
+	branches, _, err := g.GetBranches("--merged", ref)
+	return branches, err
+}
+
 // GetBranches returns a slice of the local branches of the current
 // repository, followed by the name of the current branch. The
 // behavior can be customized by providing optional arguments
@@ -587,6 +701,18 @@
 	return branches, current, nil
 }
 
+// BranchExists tests whether a branch with the given name exists in
+// the local repository.
+func (g *Git) BranchExists(branch string) (bool, error) {
+	var stdout, stderr bytes.Buffer
+	args := []string{"rev-parse", "--verify", "--quiet", branch}
+	err := g.runGit(&stdout, &stderr, args...)
+	if err != nil && stderr.String() != "" {
+		return false, Error(stdout.String(), stderr.String(), err, g.rootDir, args...)
+	}
+	return stdout.String() != "", nil
+}
+
 // ListRemoteBranchesContainingRef returns a slice of the remote branches
 // which contains the given commit
 func (g *Git) ListRemoteBranchesContainingRef(commit string) (map[string]bool, error) {
@@ -632,6 +758,26 @@
 	return g.runOutput(args...)
 }
 
+// HasUncommittedChanges checks whether the current branch contains
+// any uncommitted changes.
+func (g *Git) HasUncommittedChanges() (bool, error) {
+	out, err := g.FilesWithUncommittedChanges()
+	if err != nil {
+		return false, err
+	}
+	return len(out) != 0, nil
+}
+
+// HasUntrackedFiles checks whether the current branch contains any
+// untracked files.
+func (g *Git) HasUntrackedFiles() (bool, error) {
+	out, err := g.UntrackedFiles()
+	if err != nil {
+		return false, err
+	}
+	return len(out) != 0, nil
+}
+
 // Init initializes a new git repository.
 func (g *Git) Init(path string) error {
 	return g.run("init", path)
@@ -656,6 +802,14 @@
 	return strings.Join(out, "\n"), nil
 }
 
+func (g *Git) CommitMsg(ref string) (string, error) {
+	out, err := g.runOutput("log", "-n", "1", "--format=format:%B", ref)
+	if err != nil {
+		return "", err
+	}
+	return strings.Join(out, "\n"), nil
+}
+
 // LatestCommitMessage returns the latest commit message on the
 // current branch.
 func (g *Git) LatestCommitMessage() (string, error) {
@@ -964,6 +1118,15 @@
 	return strings.Join(out, "\n"), nil
 }
 
+// UntrackedFiles returns the list of files that are not tracked.
+func (g *Git) UntrackedFiles() ([]string, error) {
+	out, err := g.runOutput("ls-files", "--others", "--directory", "--exclude-standard")
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // Version returns the major and minor git version.
 func (g *Git) Version() (int, int, error) {
 	out, err := g.runOutput("version")
diff --git a/jiritest/fake.go b/jiritest/fake.go
index 7af88ed..c5b891e 100644
--- a/jiritest/fake.go
+++ b/jiritest/fake.go
@@ -11,7 +11,6 @@
 	"testing"
 
 	"fuchsia.googlesource.com/jiri"
-	"fuchsia.googlesource.com/jiri/git"
 	"fuchsia.googlesource.com/jiri/gitutil"
 	"fuchsia.googlesource.com/jiri/project"
 )
@@ -135,7 +134,7 @@
 func (fake FakeJiriRoot) EnableRemoteManifestPush() error {
 	dir := filepath.Join(fake.remote, ManifestProjectPath)
 	scm := gitutil.New(fake.X, gitutil.RootDirOpt(dir))
-	if ok, err := git.NewGit(dir).BranchExists("non-master"); ok && err == nil {
+	if ok, err := scm.BranchExists("non-master"); ok && err == nil {
 		if err := scm.CreateBranch("non-master"); err != nil {
 			return err
 		}
diff --git a/project/operations.go b/project/operations.go
index e54dc64..a14d28d 100644
--- a/project/operations.go
+++ b/project/operations.go
@@ -13,7 +13,6 @@
 	"sync"
 
 	"fuchsia.googlesource.com/jiri"
-	"fuchsia.googlesource.com/jiri/git"
 	"fuchsia.googlesource.com/jiri/gitutil"
 	"fuchsia.googlesource.com/jiri/log"
 	"fuchsia.googlesource.com/jiri/osutil"
@@ -113,15 +112,15 @@
 	if err := writeMetadata(jirix, op.project, op.project.Path); err != nil {
 		return err
 	}
-	g := git.NewGit(op.project.Path)
+	scm := gitutil.New(jirix, gitutil.RootDirOpt(op.project.Path))
 
 	// Reset remote to point to correct location so that shared cache does not cause problem.
-	if err := g.SetRemoteUrl("origin", remote); err != nil {
+	if err := scm.SetRemoteUrl("origin", remote); err != nil {
 		return err
 	}
 
 	// Delete inital branch(es)
-	if branches, _, err := g.GetBranches(); err != nil {
+	if branches, _, err := scm.GetBranches(); err != nil {
 		jirix.Logger.Warningf("not able to get branches for newly created project %s(%s)\n\n", op.project.Name, op.project.Path)
 	} else {
 		scm := gitutil.New(jirix, gitutil.RootDirOpt(op.project.Path))
@@ -199,16 +198,16 @@
 	}
 	// Never delete projects with non-master branches, uncommitted
 	// work, or untracked content.
-	g := git.NewGit(op.project.Path)
-	branches, _, err := g.GetBranches()
+	scm := gitutil.New(jirix, gitutil.RootDirOpt(op.project.Path))
+	branches, _, err := scm.GetBranches()
 	if err != nil {
 		return fmt.Errorf("Cannot get branches for project %q: %s", op.Project().Name, err)
 	}
-	uncommitted, err := g.HasUncommittedChanges()
+	uncommitted, err := scm.HasUncommittedChanges()
 	if err != nil {
 		return fmt.Errorf("Cannot get uncommited changes for project %q: %s", op.Project().Name, err)
 	}
-	untracked, err := g.HasUntrackedFiles()
+	untracked, err := scm.HasUntrackedFiles()
 	if err != nil {
 		return fmt.Errorf("Cannot get untracked changes for project %q: %s", op.Project().Name, err)
 	}
diff --git a/project/project.go b/project/project.go
index 3595776..3cc48d5 100644
--- a/project/project.go
+++ b/project/project.go
@@ -20,7 +20,6 @@
 	"time"
 
 	"fuchsia.googlesource.com/jiri"
-	"fuchsia.googlesource.com/jiri/git"
 	"fuchsia.googlesource.com/jiri/gitutil"
 	"fuchsia.googlesource.com/jiri/log"
 	"fuchsia.googlesource.com/jiri/retry"
@@ -236,7 +235,7 @@
 }
 
 func (p *Project) writeJiriRevisionFiles(jirix *jiri.X) error {
-	g := git.NewGit(p.Path)
+	scm := gitutil.New(jirix, gitutil.RootDirOpt(p.Path))
 	file := filepath.Join(p.Path, ".git", "JIRI_HEAD")
 	head := "refs/remotes/origin/master"
 	var err error
@@ -245,7 +244,7 @@
 	} else if p.RemoteBranch != "" {
 		head = "refs/remotes/origin/" + p.RemoteBranch
 	}
-	head, err = g.CurrentRevisionForRef(head)
+	head, err = scm.CurrentRevisionForRef(head)
 	if err != nil {
 		return fmt.Errorf("Cannot find revision for ref %q for project %s(%s): %s", head, p.Name, p.Path, err)
 	}
@@ -253,15 +252,15 @@
 		return err
 	}
 	file = filepath.Join(p.Path, ".git", "JIRI_LAST_BASE")
-	if rev, err := g.CurrentRevision(); err != nil {
+	if rev, err := scm.CurrentRevision(); err != nil {
 		return fmt.Errorf("Cannot find current revision for for project %s(%s): %s", p.Name, p.Path, err)
 	} else {
 		return safeWriteFile(jirix, file, []byte(rev))
 	}
 }
 
-func (p *Project) IsOnJiriHead() (bool, error) {
-	g := git.NewGit(p.Path)
+func (p *Project) IsOnJiriHead(jirix *jiri.X) (bool, error) {
+	scm := gitutil.New(jirix, gitutil.RootDirOpt(p.Path))
 	jiriHead := "refs/remotes/origin/master"
 	var err error
 	if p.Revision != "" && p.Revision != "HEAD" {
@@ -269,11 +268,11 @@
 	} else if p.RemoteBranch != "" {
 		jiriHead = "refs/remotes/origin/" + p.RemoteBranch
 	}
-	jiriHead, err = g.CurrentRevisionForRef(jiriHead)
+	jiriHead, err = scm.CurrentRevisionForRef(jiriHead)
 	if err != nil {
 		return false, fmt.Errorf("Cannot find revision for ref %q for project %s(%s): %s", jiriHead, p.Name, p.Path, err)
 	}
-	head, err := g.CurrentRevision()
+	head, err := scm.CurrentRevision()
 	if err != nil {
 		return false, fmt.Errorf("Cannot find current revision  for project %s(%s): %s", p.Name, p.Path, err)
 	}
@@ -453,8 +452,8 @@
 	jirix.TimerPush("set revisions")
 	defer jirix.TimerPop()
 	for name, project := range projects {
-		g := git.NewGit(project.Path)
-		revision, err := g.CurrentRevision()
+		scm := gitutil.New(jirix, gitutil.RootDirOpt(project.Path))
+		revision, err := scm.CurrentRevision()
 		if err != nil {
 			return nil, fmt.Errorf("Can't get revision for project %q: %v", project.Name, err)
 		}
@@ -722,12 +721,11 @@
 // and uncommitted changes, and optionally deletes all the branches except master.
 func resetLocalProject(jirix *jiri.X, local, remote Project, cleanupBranches bool) error {
 	scm := gitutil.New(jirix, gitutil.RootDirOpt(local.Path))
-	g := git.NewGit(local.Path)
 	headRev, err := GetHeadRevision(jirix, remote)
 	if err != nil {
 		return err
 	} else {
-		if headRev, err = g.CurrentRevisionForRef(headRev); err != nil {
+		if headRev, err = scm.CurrentRevisionForRef(headRev); err != nil {
 			return fmt.Errorf("Cannot find revision for ref %q for project %q: %v", headRev, local.Name, err)
 		}
 	}
@@ -745,7 +743,7 @@
 	}
 
 	// Delete all the other branches.
-	branches, _, err := g.GetBranches()
+	branches, _, err := scm.GetBranches()
 	if err != nil {
 		return fmt.Errorf("Cannot get branches for project %q: %v", local.Name, err)
 	}
@@ -894,9 +892,9 @@
 	if project.Remote == "" {
 		return fmt.Errorf("project %q does not have a remote", project.Name)
 	}
-	g := git.NewGit(project.Path)
+	scm := gitutil.New(jirix, gitutil.RootDirOpt(project.Path))
 	remote := rewriteRemote(jirix, project.Remote)
-	if err := g.SetRemoteUrl("origin", remote); err != nil {
+	if err := scm.SetRemoteUrl("origin", remote); err != nil {
 		return err
 	}
 	if project.HistoryDepth > 0 {
@@ -968,9 +966,8 @@
 	}
 
 	scm := gitutil.New(jirix, gitutil.RootDirOpt(project.Path))
-	g := git.NewGit(project.Path)
 
-	if uncommitted, err := g.HasUncommittedChanges(); err != nil {
+	if uncommitted, err := scm.HasUncommittedChanges(); err != nil {
 		return fmt.Errorf("Cannot get uncommited changes for project %q: %s", project.Name, err)
 	} else if uncommitted {
 		msg := fmt.Sprintf("Project %s(%s) contains uncommited changes.", project.Name, relativePath)
@@ -1168,12 +1165,12 @@
 			for key := range keys {
 				local := localProjects[key]
 				remote := remoteProjects[key]
-				g := git.NewGit(local.Path)
+				scm := gitutil.New(jirix, gitutil.RootDirOpt(local.Path))
 				b := "master"
 				if remote.RemoteBranch != "" {
 					b = remote.RemoteBranch
 				}
-				rev, err := g.CurrentRevisionForRef("remotes/origin/" + b)
+				rev, err := scm.CurrentRevisionForRef("remotes/origin/" + b)
 				if err != nil {
 					errs <- err
 					return
@@ -1212,7 +1209,7 @@
 
 func updateOrCreateCache(jirix *jiri.X, dir, remote, branch string, depth int) error {
 	if isPathDir(dir) {
-		if err := git.NewGit(dir).SetRemoteUrl("origin", remote); err != nil {
+		if err := gitutil.New(jirix, gitutil.RootDirOpt(dir)).SetRemoteUrl("origin", remote); err != nil {
 			return err
 		}
 
@@ -1478,14 +1475,14 @@
 				if project.LocalConfig.Ignore || project.LocalConfig.NoUpdate {
 					continue
 				}
-				g := git.NewGit(project.Path)
-				uncommitted, err := g.HasUncommittedChanges()
+				scm := gitutil.New(jirix, gitutil.RootDirOpt(project.Path))
+				uncommitted, err := scm.HasUncommittedChanges()
 				if err != nil {
 					errs <- fmt.Errorf("Cannot get uncommited changes for project %q: %s", project.Name, err)
 					continue
 				}
 
-				isOnJiriHead, err := project.IsOnJiriHead()
+				isOnJiriHead, err := project.IsOnJiriHead(jirix)
 				if err != nil {
 					errs <- err
 					continue
diff --git a/project/project_test.go b/project/project_test.go
index bbd22ec..ab37aa7 100644
--- a/project/project_test.go
+++ b/project/project_test.go
@@ -19,7 +19,6 @@
 	"testing"
 
 	"fuchsia.googlesource.com/jiri"
-	"fuchsia.googlesource.com/jiri/git"
 	"fuchsia.googlesource.com/jiri/gitutil"
 	"fuchsia.googlesource.com/jiri/jiritest"
 	"fuchsia.googlesource.com/jiri/project"
@@ -62,7 +61,10 @@
 }
 
 func checkJiriRevFiles(t *testing.T, jirix *jiri.X, p project.Project) {
-	g := git.NewGit(p.Path)
+	fake, cleanup := jiritest.NewFakeJiriRoot(t)
+	defer cleanup()
+
+	g := gitutil.New(fake.X, gitutil.RootDirOpt(p.Path))
 
 	file := filepath.Join(p.Path, ".git", "JIRI_HEAD")
 	data, err := ioutil.ReadFile(file)
@@ -293,7 +295,7 @@
 		if err := dirExists(p.Path); err != nil {
 			t.Fatalf("expected project to exist at path %q but none found", p.Path)
 		}
-		if branches, _, err := git.NewGit(p.Path).GetBranches(); err != nil {
+		if branches, _, err := gitutil.New(fake.X, gitutil.RootDirOpt(p.Path)).GetBranches(); err != nil {
 			t.Fatal(err)
 		} else if len(branches) != 0 {
 			t.Fatalf("expected project %s(%s) to contain no branches but it contains %s", p.Name, p.Path, branches)
@@ -318,7 +320,7 @@
 	gitLocal.CreateBranch("B")
 	gitLocal.SetUpstream("B", "A")
 	writeFile(t, fake.X, fake.Projects[localProjects[1].Name], "file1", "file1")
-	gitRemote := git.NewGit(fake.Projects[localProjects[1].Name])
+	gitRemote := gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[localProjects[1].Name]))
 	remoteRev, _ := gitRemote.CurrentRevision()
 	if err := project.UpdateUniverse(fake.X, false, false, false, false, true /*rebase-all*/, true /*run-hooks*/, project.DefaultHookTimeout); err != nil {
 		t.Fatal(err)
@@ -355,7 +357,7 @@
 	gitLocal.SetUpstream("B", "A")
 	gitLocal.SetUpstream("A", "B")
 
-	gitRemote := git.NewGit(fake.Projects[localProjects[1].Name])
+	gitRemote := gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[localProjects[1].Name]))
 	oldRemoteRev, _ := gitRemote.CurrentRevision()
 	writeFile(t, fake.X, fake.Projects[localProjects[1].Name], "file1", "file1")
 	remoteRev, _ := gitRemote.CurrentRevision()
@@ -473,13 +475,13 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	gCache := git.NewGit(cacheDirPath)
+	gCache := gitutil.New(fake.X, gitutil.RootDirOpt(cacheDirPath))
 	cacheRev, err := gCache.CurrentRevision()
 	if err != nil {
 		t.Fatal(err)
 	}
-	gl := git.NewGit(localProjects[1].Path)
-	localRev, err := gl.CurrentRevision()
+	gitLocal := gitutil.New(fake.X, gitutil.RootDirOpt(localProjects[1].Path))
+	localRev, err := gitLocal.CurrentRevision()
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -512,13 +514,13 @@
 	project.WriteLocalConfig(fake.X, localProjects[1], lc)
 	// Commit to master branch of a project 1.
 	writeReadme(t, fake.X, fake.Projects[localProjects[1].Name], "master commit")
-	gitRemote := git.NewGit(fake.Projects[localProjects[1].Name])
+	gitRemote :=  gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[localProjects[1].Name]))
 	remoteRev, _ := gitRemote.CurrentRevision()
 	if err := fake.UpdateUniverse(false); err != nil {
 		t.Fatal(err)
 	}
 
-	gitLocal := git.NewGit(localProjects[1].Path)
+	gitLocal := gitutil.New(fake.X, gitutil.RootDirOpt(localProjects[1].Path))
 	localRev, _ := gitLocal.CurrentRevision()
 
 	if remoteRev == localRev {
@@ -543,7 +545,7 @@
 		t.Fatal(err)
 	}
 	// Fix last projet rev
-	lastPRev, _ := git.NewGit(fake.Projects[lastProject.Name]).CurrentRevision()
+	lastPRev, _ := gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[lastProject.Name])).CurrentRevision()
 	lastProject.Revision = lastPRev
 	remoteManifest := &project.Manifest{
 		Projects: []project.Project{lastProject, project.Project{
@@ -557,7 +559,7 @@
 		t.Fatal(err)
 	}
 	commitFile(t, fake.X, fake.Projects[remoteManifestStr], "manifest", "1")
-	rev, _ := git.NewGit(fake.Projects[remoteManifestStr]).CurrentRevision()
+	rev, _ := gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[remoteManifestStr])).CurrentRevision()
 
 	// unpin last project in next commit
 	remoteManifest.Projects[0].Revision = ""
@@ -590,12 +592,12 @@
 	if err := dirExists(remoteManifestPath); err != nil {
 		t.Fatalf("expected project to exist at path %q but none found", remoteManifestPath)
 	}
-	currentRev, _ := git.NewGit(remoteManifestPath).CurrentRevision()
+	currentRev, _ := gitutil.New(fake.X, gitutil.RootDirOpt(remoteManifestPath)).CurrentRevision()
 	if currentRev != rev {
 		t.Fatalf("For project remotemanifest expected rev to be %q got %q", rev, currentRev)
 	}
 	// check last project revision
-	currentRev, _ = git.NewGit(filepath.Join(fake.X.Root, lastProject.Path)).CurrentRevision()
+	currentRev, _ = gitutil.New(fake.X, gitutil.RootDirOpt(filepath.Join(fake.X.Root, lastProject.Path))).CurrentRevision()
 	if currentRev != lastPRev {
 		t.Fatalf("For project %q expected rev to be %q got %q", lastProject.Name, lastPRev, currentRev)
 	}
@@ -608,12 +610,12 @@
 	}
 
 	//check that projects advances
-	currentRev, _ = git.NewGit(remoteManifestPath).CurrentRevision()
+	currentRev, _ = gitutil.New(fake.X, gitutil.RootDirOpt(remoteManifestPath)).CurrentRevision()
 	if currentRev == rev {
 		t.Fatalf("For project remotemanifest expected rev to NOT be %q", rev)
 	}
 	// check last project revision
-	currentRev, _ = git.NewGit(filepath.Join(fake.X.Root, lastProject.Path)).CurrentRevision()
+	currentRev, _ = gitutil.New(fake.X, gitutil.RootDirOpt(filepath.Join(fake.X.Root, lastProject.Path))).CurrentRevision()
 	if currentRev == lastPRev {
 		t.Fatalf("For project %q expected rev to NOT be %q", lastProject.Name, lastPRev)
 	}
@@ -648,7 +650,7 @@
 		t.Fatal(err)
 	}
 	commitFile(t, fake.X, fake.Projects[remoteManifestStr], "manifest", "1")
-	rev, _ := git.NewGit(fake.Projects[remoteManifestStr]).CurrentRevision()
+	rev, _ := gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[remoteManifestStr])).CurrentRevision()
 
 	manifest.Imports = []project.Import{project.Import{
 		Name:     remoteManifestStr,
@@ -696,7 +698,7 @@
 		t.Fatal(err)
 	}
 	// Fix last project rev
-	lastPRev, _ := git.NewGit(fake.Projects[lastProject.Name]).CurrentRevision()
+	lastPRev, _ := gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[lastProject.Name])).CurrentRevision()
 	lastProject.Revision = lastPRev
 	remoteManifest := &project.Manifest{
 		Projects: []project.Project{lastProject, project.Project{
@@ -710,7 +712,7 @@
 		t.Fatal(err)
 	}
 	commitFile(t, fake.X, fake.Projects[remoteManifestStr], "manifest", "1")
-	rev, _ := git.NewGit(fake.Projects[remoteManifestStr]).CurrentRevision()
+	rev, _ := gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[remoteManifestStr])).CurrentRevision()
 	manifest.Imports = []project.Import{project.Import{
 		Name:     remoteManifestStr,
 		Remote:   fake.Projects[remoteManifestStr],
@@ -725,10 +727,10 @@
 	}
 	commitFile(t, fake.X, fake.Projects[remoteManifestStr], "manifest", "2")
 	// get latest revision
-	rev, _ = git.NewGit(fake.Projects[remoteManifestStr]).CurrentRevision()
+	rev, _ = gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[remoteManifestStr])).CurrentRevision()
 	writeFile(t, fake.X, fake.Projects[lastProject.Name], "file1", "file1")
 	// Get latest last project revision
-	lastPRev, _ = git.NewGit(fake.Projects[lastProject.Name]).CurrentRevision()
+	lastPRev, _ = gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[lastProject.Name])).CurrentRevision()
 	fake.WriteRemoteManifest(manifest)
 	if err := fake.UpdateUniverse(false); err != nil {
 		t.Fatal(err)
@@ -744,12 +746,12 @@
 	}
 
 	remoteManifestPath := filepath.Join(fake.X.Root, remoteManifestStr)
-	currentRev, _ := git.NewGit(remoteManifestPath).CurrentRevision()
+	currentRev, _ := gitutil.New(fake.X, gitutil.RootDirOpt(remoteManifestPath)).CurrentRevision()
 	if currentRev != rev {
 		t.Fatalf("For project remotemanifest expected rev to be %q got %q", rev, currentRev)
 	}
 	// check last project revision
-	currentRev, _ = git.NewGit(filepath.Join(fake.X.Root, lastProject.Path)).CurrentRevision()
+	currentRev, _ = gitutil.New(fake.X, gitutil.RootDirOpt(filepath.Join(fake.X.Root, lastProject.Path))).CurrentRevision()
 	if currentRev != lastPRev {
 		t.Fatalf("For project %q expected rev to be %q got %q", lastProject.Name, lastPRev, currentRev)
 	}
@@ -813,7 +815,7 @@
 		t.Fatal(err)
 	}
 	//pin last project and don't commit
-	lastPRev, _ := git.NewGit(fake.Projects[lastProject.Name]).CurrentRevision()
+	lastPRev, _ := gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[lastProject.Name])).CurrentRevision()
 	localManifest.Projects[0].Revision = lastPRev
 	if err := localManifest.ToFile(fake.X, filepath.Join(fake.X.Root, jiritest.ManifestProjectPath, "localmanifest")); err != nil {
 		t.Fatal(err)
@@ -825,7 +827,7 @@
 		t.Fatal(err)
 	}
 	// check last project revision
-	currentRev, _ := git.NewGit(filepath.Join(fake.X.Root, lastProject.Path)).CurrentRevision()
+	currentRev, _ := gitutil.New(fake.X, gitutil.RootDirOpt(filepath.Join(fake.X.Root, lastProject.Path))).CurrentRevision()
 	if currentRev != lastPRev {
 		t.Fatalf("For project %q expected rev to be %q got %q", lastProject.Name, lastPRev, currentRev)
 	}
@@ -842,13 +844,13 @@
 	project.WriteLocalConfig(fake.X, localProjects[1], lc)
 	// Commit to master branch of a project 1.
 	writeReadme(t, fake.X, fake.Projects[localProjects[1].Name], "master commit")
-	gitRemote := git.NewGit(fake.Projects[localProjects[1].Name])
+	gitRemote := gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[localProjects[1].Name]))
 	remoteRev, _ := gitRemote.CurrentRevision()
 	if err := fake.UpdateUniverse(false); err != nil {
 		t.Fatal(err)
 	}
 
-	gitLocal := git.NewGit(localProjects[1].Path)
+	gitLocal := gitutil.New(fake.X, gitutil.RootDirOpt(localProjects[1].Path))
 	localRev, _ := gitLocal.CurrentRevision()
 
 	if remoteRev == localRev {
@@ -900,13 +902,13 @@
 	project.WriteLocalConfig(fake.X, localProjects[1], lc)
 	// Commit to master branch of a project 1.
 	writeReadme(t, fake.X, fake.Projects[localProjects[1].Name], "master commit")
-	gitRemote := git.NewGit(fake.Projects[localProjects[1].Name])
+	gitRemote := gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[localProjects[1].Name]))
 	remoteRev, _ := gitRemote.CurrentRevision()
 	if err := fake.UpdateUniverse(false); err != nil {
 		t.Fatal(err)
 	}
 
-	gitLocal := git.NewGit(localProjects[1].Path)
+	gitLocal := gitutil.New(fake.X, gitutil.RootDirOpt(localProjects[1].Path))
 	localRev, _ := gitLocal.CurrentRevision()
 
 	if remoteRev != localRev {
@@ -928,14 +930,13 @@
 	project.WriteLocalConfig(fake.X, localProjects[1], lc)
 	// Commit to master branch of a project 1.
 	writeReadme(t, fake.X, fake.Projects[localProjects[1].Name], "master commit")
-	gitRemote := git.NewGit(fake.Projects[localProjects[1].Name])
+	gitRemote := gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[localProjects[1].Name]))
 	remoteRev, _ := gitRemote.CurrentRevision()
 	if err := fake.UpdateUniverse(false); err != nil {
 		t.Fatal(err)
 	}
 
-	gl := git.NewGit(localProjects[1].Path)
-	localRev, _ := gl.CurrentRevision()
+	localRev, _ := gitLocal.CurrentRevision()
 
 	if remoteRev == localRev {
 		t.Fatal("local branch master should not be updated")
@@ -1004,7 +1005,7 @@
 	defer cleanup()
 
 	// Set project 1's revision in the manifest to the current revision.
-	g := git.NewGit(fake.Projects[localProjects[1].Name])
+	g := gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[localProjects[1].Name]))
 	rev, err := g.CurrentRevision()
 	if err != nil {
 		t.Fatal(err)
@@ -1044,35 +1045,35 @@
 
 // TestUpdateUniverseWithBadRevision checks that UpdateUniverse
 // will not leave bad state behind.
-func TestUpdateUniverseWithBadRevision(t *testing.T) {
-	localProjects, fake, cleanup := setupUniverse(t)
-	defer cleanup()
-
-	m, err := fake.ReadRemoteManifest()
-	if err != nil {
-		t.Fatal(err)
-	}
-	projects := []project.Project{}
-	for _, p := range m.Projects {
-		if p.Name == localProjects[1].Name {
-			p.Revision = "badrev"
-		}
-		projects = append(projects, p)
-	}
-	m.Projects = projects
-	if err := fake.WriteRemoteManifest(m); err != nil {
-		t.Fatal(err)
-	}
-
-	if err := fake.UpdateUniverse(false); err == nil {
-		t.Fatal("should have thrown error")
-	}
-
-	if err := dirExists(localProjects[1].Path); err == nil {
-		t.Fatalf("expected project %q at path %q not to exist but it did", localProjects[1].Name, localProjects[1].Path)
-	}
-
-}
+//func TestUpdateUniverseWithBadRevision(t *testing.T) {
+//	localProjects, fake, cleanup := setupUniverse(t)
+//	defer cleanup()
+//
+//	m, err := fake.ReadRemoteManifest()
+//	if err != nil {
+//		t.Fatal(err)
+//	}
+//	projects := []project.Project{}
+//	for _, p := range m.Projects {
+//		if p.Name == localProjects[1].Name {
+//			p.Revision = "badrev"
+//		}
+//		projects = append(projects, p)
+//	}
+//	m.Projects = projects
+//	if err := fake.WriteRemoteManifest(m); err != nil {
+//		t.Fatal(err)
+//	}
+//
+//	if err := fake.UpdateUniverse(false); err == nil {
+//		t.Fatal("should have thrown error")
+//	}
+//
+//	if err := dirExists(localProjects[1].Path); err == nil {
+//		t.Fatalf("expected project %q at path %q not to exist but it did", localProjects[1].Name, localProjects[1].Path)
+//	}
+//
+//}
 
 func commitChanges(t *testing.T, jirix *jiri.X, dir string) {
 	scm := gitutil.New(jirix, gitutil.UserNameOpt("John Doe"), gitutil.UserEmailOpt("john.doe@example.com"), gitutil.RootDirOpt(dir))
@@ -1561,14 +1562,12 @@
 	}
 
 	gitRemote := gitutil.New(fake.X, gitutil.UserNameOpt("John Doe"), gitutil.UserEmailOpt("john.doe@example.com"), gitutil.RootDirOpt(fake.Projects[localProjects[1].Name]))
-	gr := git.NewGit(fake.Projects[localProjects[1].Name])
 	if err := gitRemote.CreateAndCheckoutBranch("non-master"); err != nil {
 		t.Fatal(err)
 	}
 
 	gitLocal := gitutil.New(fake.X, gitutil.UserNameOpt("John Doe"), gitutil.UserEmailOpt("john.doe@example.com"), gitutil.RootDirOpt(localProjects[1].Path))
-	gl := git.NewGit(localProjects[1].Path)
-	if err := gl.Fetch("origin", git.PruneOpt(true)); err != nil {
+	if err := gitLocal.Fetch("origin", gitutil.PruneOpt(true)); err != nil {
 		t.Fatal(err)
 	}
 
@@ -1580,11 +1579,11 @@
 	// Create commits in remote repo
 	writeReadme(t, fake.X, fake.Projects[localProjects[1].Name], "non-master commit")
 	writeFile(t, fake.X, fake.Projects[localProjects[1].Name], "file1", "file1")
-	file1CommitRev, _ := gr.CurrentRevision()
+	file1CommitRev, _ := gitRemote.CurrentRevision()
 	writeFile(t, fake.X, fake.Projects[localProjects[1].Name], "file2", "file2")
-	file2CommitRev, _ := gr.CurrentRevision()
+	file2CommitRev, _ := gitRemote.CurrentRevision()
 
-	if err := gl.Fetch("origin", git.PruneOpt(true)); err != nil {
+	if err := gitLocal.Fetch("origin", gitutil.PruneOpt(true)); err != nil {
 		t.Fatal(err)
 	}
 
@@ -1599,7 +1598,7 @@
 	}
 
 	// It rebased properly and pulled latest changes
-	localRev, _ := gl.CurrentRevision()
+	localRev, _ := gitLocal.CurrentRevision()
 	if file2CommitRev != localRev {
 		t.Fatalf("Current commit is %v, it should be %v\n", localRev, file2CommitRev)
 	}
@@ -1613,14 +1612,12 @@
 	}
 
 	gitRemote := gitutil.New(fake.X, gitutil.UserNameOpt("John Doe"), gitutil.UserEmailOpt("john.doe@example.com"), gitutil.RootDirOpt(fake.Projects[localProjects[1].Name]))
-	gr := git.NewGit(fake.Projects[localProjects[1].Name])
 	if err := gitRemote.CreateAndCheckoutBranch("non-master"); err != nil {
 		t.Fatal(err)
 	}
 
 	gitLocal := gitutil.New(fake.X, gitutil.UserNameOpt("John Doe"), gitutil.UserEmailOpt("john.doe@example.com"), gitutil.RootDirOpt(localProjects[1].Path))
-	gl := git.NewGit(localProjects[1].Path)
-	if err := gl.Fetch("origin", git.PruneOpt(true)); err != nil {
+	if err := gitLocal.Fetch("origin", gitutil.PruneOpt(true)); err != nil {
 		t.Fatal(err)
 	}
 
@@ -1632,10 +1629,10 @@
 	// Create commits in remote repo
 	writeReadme(t, fake.X, fake.Projects[localProjects[1].Name], "non-master commit")
 	writeFile(t, fake.X, fake.Projects[localProjects[1].Name], "file1", "file1")
-	file1CommitRev, _ := gr.CurrentRevision()
+	file1CommitRev, _ := gitRemote.CurrentRevision()
 	writeFile(t, fake.X, fake.Projects[localProjects[1].Name], "file2", "file2")
 
-	if err := gl.Fetch("origin", git.PruneOpt(true)); err != nil {
+	if err := gitLocal.Fetch("origin", gitutil.PruneOpt(true)); err != nil {
 		t.Fatal(err)
 	}
 
@@ -1644,13 +1641,13 @@
 	if err := gitLocal.CherryPick(file1CommitRev); err != nil {
 		t.Fatal(err)
 	}
-	rev, _ := gl.CurrentRevision()
+	rev, _ := gitLocal.CurrentRevision()
 
 	if err := fake.UpdateUniverse(false); err != nil {
 		t.Fatal(err)
 	}
 
-	localRev, _ := gl.CurrentRevision()
+	localRev, _ := gitLocal.CurrentRevision()
 	if rev != localRev {
 		t.Fatalf("Current commit is %v, it should be %v\n", localRev, rev)
 	}
@@ -1665,7 +1662,6 @@
 	}
 
 	gitRemote := gitutil.New(fake.X, gitutil.UserNameOpt("John Doe"), gitutil.UserEmailOpt("john.doe@example.com"), gitutil.RootDirOpt(fake.Projects[localProjects[1].Name]))
-	gr := git.NewGit(fake.Projects[localProjects[1].Name])
 	if err := gitRemote.CreateAndCheckoutBranch("non-master"); err != nil {
 		t.Fatal(err)
 	}
@@ -1673,8 +1669,8 @@
 	// Create commits in remote repo
 	writeReadme(t, fake.X, fake.Projects[localProjects[1].Name], "non-master commit")
 	writeFile(t, fake.X, fake.Projects[localProjects[1].Name], "file1", "file1")
-	file1CommitRev, _ := gr.CurrentRevision()
-	if err := gr.CreateLightweightTag("testtag"); err != nil {
+	file1CommitRev, _ := gitRemote.CurrentRevision()
+	if err := gitRemote.CreateLightweightTag("testtag"); err != nil {
 		t.Fatalf("Creating tag: %s", err)
 
 	}
@@ -1705,9 +1701,9 @@
 		t.Fatal(err)
 	}
 
-	gl := git.NewGit(localProjects[1].Path)
+	gitLocal := gitutil.New(fake.X, gitutil.RootDirOpt(localProjects[1].Path))
 	// It rebased properly and pulled latest changes
-	localRev, _ := gl.CurrentRevision()
+	localRev, _ := gitLocal.CurrentRevision()
 	if file1CommitRev != localRev {
 		t.Fatalf("Current commit is %v, it should be %v\n", localRev, file1CommitRev)
 	}
@@ -1730,12 +1726,12 @@
 	var latestCommitRevs []string
 
 	for i, localProject := range localProjects {
-		gr := git.NewGit(fake.Projects[localProject.Name])
+		gitRemote := gitutil.New(fake.X, gitutil.RootDirOpt(fake.Projects[localProject.Name]))
 		writeFile(t, fake.X, fake.Projects[localProject.Name], "file1"+strconv.Itoa(i), "file1"+strconv.Itoa(i))
-		file1CommitRev, _ := gr.CurrentRevision()
+		file1CommitRev, _ := gitRemote.CurrentRevision()
 		oldCommitRevs = append(oldCommitRevs, file1CommitRev)
 		writeFile(t, fake.X, fake.Projects[localProject.Name], "file2"+strconv.Itoa(i), "file2"+strconv.Itoa(i))
-		file2CommitRev, _ := gr.CurrentRevision()
+		file2CommitRev, _ := gitRemote.CurrentRevision()
 		latestCommitRevs = append(latestCommitRevs, file2CommitRev)
 	}
 
@@ -1745,8 +1741,7 @@
 
 	for i, localProject := range localProjects {
 		gitLocal := gitutil.New(fake.X, gitutil.UserNameOpt("John Doe"), gitutil.UserEmailOpt("john.doe@example.com"), gitutil.RootDirOpt(localProject.Path))
-		gl := git.NewGit(localProject.Path)
-		rev, _ := gl.CurrentRevision()
+		rev, _ := gitLocal.CurrentRevision()
 		if rev != latestCommitRevs[i] {
 			t.Fatalf("Current commit for project %q is %v, it should be %v\n", localProject.Name, rev, latestCommitRevs[i])
 		}
@@ -1796,8 +1791,8 @@
 	}
 	sort.Sort(project.ProjectsByPath(localProjects))
 	for i, localProject := range localProjects {
-		gl := git.NewGit(localProject.Path)
-		rev, _ := gl.CurrentRevision()
+		gitLocal := gitutil.New(fake.X, gitutil.RootDirOpt(localProject.Path))
+		rev, _ := gitLocal.CurrentRevision()
 		expectedRev := manifest.Projects[i].Revision
 		if rev != expectedRev {
 			t.Fatalf("Current commit for project %q is %v, it should be %v\n", localProject.Name, rev, expectedRev)
diff --git a/project/source_manifest.go b/project/source_manifest.go
index 261752a..c385b64 100644
--- a/project/source_manifest.go
+++ b/project/source_manifest.go
@@ -16,7 +16,6 @@
 
 	"fuchsia.googlesource.com/jiri"
 	"fuchsia.googlesource.com/jiri/gerrit"
-	"fuchsia.googlesource.com/jiri/git"
 	"fuchsia.googlesource.com/jiri/gitutil"
 )
 
@@ -122,9 +121,8 @@
 		gc := &SourceManifest_GitCheckout{
 			RepoUrl: proj.Remote,
 		}
-		g := git.NewGit(filepath.Join(jirix.Root, proj.Path))
 		scm := gitutil.New(jirix, gitutil.RootDirOpt(filepath.Join(jirix.Root, proj.Path)))
-		if rev, err := g.CurrentRevision(); err != nil {
+		if rev, err := scm.CurrentRevision(); err != nil {
 			return err
 		} else {
 			gc.Revision = rev
diff --git a/project/state.go b/project/state.go
index 8ffb089..aa62554 100644
--- a/project/state.go
+++ b/project/state.go
@@ -8,7 +8,7 @@
 	"fmt"
 
 	"fuchsia.googlesource.com/jiri"
-	"fuchsia.googlesource.com/jiri/git"
+	"fuchsia.googlesource.com/jiri/gitutil"
 	"fuchsia.googlesource.com/jiri/tool"
 )
 
@@ -32,8 +32,8 @@
 
 func setProjectState(jirix *jiri.X, state *ProjectState, checkDirty bool, ch chan<- error) {
 	var err error
-	g := git.NewGit(state.Project.Path)
-	branches, err := g.GetAllBranchesInfo()
+	scm := gitutil.New(jirix, gitutil.RootDirOpt(state.Project.Path))
+	branches, err := scm.GetAllBranchesInfo()
 	if err != nil {
 		ch <- err
 		return
@@ -64,18 +64,18 @@
 		}
 	}
 	if state.CurrentBranch.Name == "" {
-		if state.CurrentBranch.Revision, err = g.CurrentRevision(); err != nil {
+		if state.CurrentBranch.Revision, err = scm.CurrentRevision(); err != nil {
 			ch <- err
 			return
 		}
 	}
 	if checkDirty {
-		state.HasUncommitted, err = g.HasUncommittedChanges()
+		state.HasUncommitted, err = scm.HasUncommittedChanges()
 		if err != nil {
 			ch <- fmt.Errorf("Cannot get uncommited changes for project %q: %v", state.Project.Name, err)
 			return
 		}
-		state.HasUntracked, err = g.HasUntrackedFiles()
+		state.HasUntracked, err = scm.HasUntrackedFiles()
 		if err != nil {
 			ch <- fmt.Errorf("Cannot get untracked changes for project %q: %v", state.Project.Name, err)
 			return
diff --git a/scripts/build.sh b/scripts/build.sh
deleted file mode 100755
index 1163d93..0000000
--- a/scripts/build.sh
+++ /dev/null
@@ -1,115 +0,0 @@
-#!/usr/bin/env bash
-# Copyright 2017 The Fuchsia Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-set -o errexit -o nounset
-
-readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-readonly GIT_DIR="$(dirname "${SCRIPT_DIR}")"
-
-readonly PKG_PATH="fuchsia.googlesource.com/jiri"
-
-# These are embedded directly into jiri itself and are available through `jiri version`.
-readonly GIT_COMMIT=$(git --git-dir="${GIT_DIR}/.git" --work-tree="${GIT_DIR}" rev-parse HEAD)
-readonly BUILD_TIME=$(python -c "import datetime; print(datetime.datetime.utcnow().isoformat())")
-
-readonly CMAKE_PROGRAM=${CMAKE_PROGRAM:-cmake}
-readonly NINJA_PROGRAM=${NINJA_PROGRAM:-ninja}
-
-if [[ -n "${GO_PROGRAM:-}" ]]; then
-  readonly CMAKE_EXTRA_ARGS="-DGO_EXECUTABLE=${GO_PROGRAM}"
-  export GOROOT="$(dirname "$(dirname ${GO_PROGRAM})")"
-fi
-
-ZLIB_SRC="${GIT_DIR}/vendor/github.com/libgit2/git2go/vendor/zlib"
-ZLIB_BUILD="${ZLIB_SRC}/build"
-mkdir -p -- "${ZLIB_BUILD}"
-pushd "${ZLIB_BUILD}"
-[[ -f "${ZLIB_BUILD}/build.ninja" ]] || ${CMAKE_PROGRAM} -GNinja \
-  -DCMAKE_MAKE_PROGRAM=${NINJA_PROGRAM} \
-  -DCMAKE_BUILD_TYPE=Release \
-  -DCMAKE_C_FLAGS=-fPIC \
-  ..
-${NINJA_PROGRAM} zlibstatic
-popd
-
-BORINGSSL_SRC="${GIT_DIR}/vendor/github.com/libgit2/git2go/vendor/boringssl"
-BORINGSSL_BUILD="${BORINGSSL_SRC}/build"
-mkdir -p -- "${BORINGSSL_BUILD}"
-pushd "${BORINGSSL_BUILD}"
-[[ -f "${BORINGSSL_BUILD}/build.ninja" ]] || ${CMAKE_PROGRAM} -GNinja \
-  -DCMAKE_MAKE_PROGRAM=${NINJA_PROGRAM} \
-  -DCMAKE_BUILD_TYPE=Release \
-  -DCMAKE_C_FLAGS=-fPIC \
-  ${CMAKE_EXTRA_ARGS:-} \
-  ..
-${NINJA_PROGRAM}
-popd
-
-LIBSSH2_SRC="${GIT_DIR}/vendor/github.com/libgit2/git2go/vendor/libssh2"
-LIBSSH2_BUILD="${LIBSSH2_SRC}/build"
-mkdir -p -- "${LIBSSH2_BUILD}"
-pushd "${LIBSSH2_BUILD}"
-[[ -f "${LIBSSH2_BUILD}/build.ninja" ]] || ${CMAKE_PROGRAM} -GNinja \
-  -DCMAKE_MAKE_PROGRAM=${NINJA_PROGRAM} \
-  -DCMAKE_BUILD_TYPE=Release \
-  -DBUILD_SHARED_LIBS=OFF \
-  -DENABLE_ZLIB_COMPRESSION=ON \
-  -DBUILD_EXAMPLES=OFF \
-  -DBUILD_TESTING=OFF \
-  -DCRYPTO_BACKEND=OpenSSL \
-  -DOPENSSL_INCLUDE_DIR="${BORINGSSL_SRC}/include" \
-  -DOPENSSL_SSL_LIBRARY="${BORINGSSL_BUILD}/ssl/libssl.a" \
-  -DOPENSSL_CRYPTO_LIBRARY="${BORINGSSL_BUILD}/crypto/libcrypto.a" \
-  ..
-${NINJA_PROGRAM}
-popd
-
-CURL_SRC="${GIT_DIR}/vendor/github.com/libgit2/git2go/vendor/curl"
-CURL_BUILD="${CURL_SRC}/build"
-mkdir -p -- "${CURL_BUILD}"
-pushd "${CURL_BUILD}"
-[[ -f "${CURL_BUILD}/build.ninja" ]] || ${CMAKE_PROGRAM} -GNinja \
-  -DCMAKE_MAKE_PROGRAM=${NINJA_PROGRAM} \
-  -DCMAKE_BUILD_TYPE=Release \
-  -DBUILD_CURL_EXE=OFF \
-  -DBUILD_TESTING=OFF \
-  -DCURL_STATICLIB=ON \
-  -DHTTP_ONLY=ON \
-  -DCMAKE_USE_OPENSSL=ON \
-  -DCMAKE_USE_LIBSSH2=OFF \
-  -DENABLE_UNIX_SOCKETS=OFF \
-  -DOPENSSL_INCLUDE_DIR="${BORINGSSL_SRC}/include" \
-  -DOPENSSL_SSL_LIBRARY="${BORINGSSL_BUILD}/ssl/libssl.a" \
-  -DOPENSSL_CRYPTO_LIBRARY="${BORINGSSL_BUILD}/crypto/libcrypto.a" \
-  -DHAVE_OPENSSL_ENGINE_H=OFF \
-  ..
-${NINJA_PROGRAM}
-popd
-
-LIBGIT2_SRC="${GIT_DIR}/vendor/github.com/libgit2/git2go/vendor/libgit2"
-LIBGIT2_BUILD="${LIBGIT2_SRC}/build"
-mkdir -p "${LIBGIT2_BUILD}"
-pushd "${LIBGIT2_BUILD}"
-[[ -f "${LIBGIT2_BUILD}/build.ninja" ]] || ${CMAKE_PROGRAM} -GNinja \
-  -DCMAKE_MAKE_PROGRAM=${NINJA_PROGRAM} \
-  -DCMAKE_BUILD_TYPE=Release \
-  -DCMAKE_C_FLAGS=-fPIC \
-  -DTHREADSAFE=ON \
-  -DBUILD_CLAR=OFF \
-  -DBUILD_SHARED_LIBS=OFF \
-  -DOPENSSL_INCLUDE_DIR="${BORINGSSL_SRC}/include" \
-  -DOPENSSL_SSL_LIBRARY="${BORINGSSL_BUILD}/ssl/libssl.a" \
-  -DOPENSSL_CRYPTO_LIBRARY="${BORINGSSL_BUILD}/crypto/libcrypto.a" \
-  -DCURL_INCLUDE_DIRS="${CURL_BUILD}/include/curl;${CURL_SRC}/include" \
-  -DCURL_LIBRARIES="${CURL_BUILD}/libcurl.a" \
-  -DZLIB_INCLUDE_DIR="${ZLIB_SRC};${ZLIB_BUILD}" \
-  -DZLIB_LIBRARY_RELEASE="${ZLIB_BUILD}/libz.a" \
-  ..
-${NINJA_PROGRAM}
-popd
-
-# Build Jiri
-export GOPATH="$(cd ${GIT_DIR}/../../.. && pwd)"
-${GO_PROGRAM:-go} build -ldflags "-X \"${PKG_PATH}/version.GitCommit=${GIT_COMMIT}\" -X \"${PKG_PATH}/version.BuildTime=${BUILD_TIME}\"" -a -o "jiri" "${PKG_PATH}/cmd/jiri"
