sketch: create empty commit on empty repo, both in innie and outtie

Life's a bit too short to fail when the git repo exists but is empty.
For innie (e.g., using -unsafe on an empty repo), we just create the
empty commit. For outtie, we do the same thing, since initializing an
empty repo would be a weird different code path.

Co-Authored-By: sketch <hello@sketch.dev>
Change-ID: se0a9606cc9f43388k
diff --git a/dockerimg/dockerimg.go b/dockerimg/dockerimg.go
index 2ada9c6..16865cf 100644
--- a/dockerimg/dockerimg.go
+++ b/dockerimg/dockerimg.go
@@ -176,11 +176,6 @@
 	// Capture the original git origin URL before we set up the temporary git server
 	config.OriginalGitOrigin = getOriginalGitOrigin(ctx, gitRoot)
 
-	err = checkForEmptyGitRepo(ctx, config.Path)
-	if err != nil {
-		return err
-	}
-
 	imgName, err := findOrBuildDockerImage(ctx, gitRoot, config.BaseImage, config.ForceRebuild, config.Verbose)
 	if err != nil {
 		return err
@@ -215,6 +210,21 @@
 		errCh <- gitSrv.serve(ctx)
 	}()
 
+	// Check if we have any commits, and if not, create an empty initial commit
+	cmd := exec.CommandContext(ctx, "git", "rev-list", "--all", "--count")
+	countOut, err := cmd.CombinedOutput()
+	if err != nil {
+		return fmt.Errorf("git rev-list --all --count: %s: %w", countOut, err)
+	}
+	commitCount := strings.TrimSpace(string(countOut))
+	if commitCount == "0" {
+		slog.Info("No commits found, creating empty initial commit")
+		cmd = exec.CommandContext(ctx, "git", "commit", "--allow-empty", "-m", "Initial empty commit")
+		if commitOut, err := cmd.CombinedOutput(); err != nil {
+			return fmt.Errorf("git commit --allow-empty: %s: %w", commitOut, err)
+		}
+	}
+
 	// Get the current host git commit
 	var commit string
 	if out, err := combinedOutput(ctx, "git", "rev-parse", "HEAD"); err != nil {
@@ -910,17 +920,6 @@
 	return nil
 }
 
-func checkForEmptyGitRepo(ctx context.Context, path string) error {
-	cmd := exec.CommandContext(ctx, "git", "rev-parse", "-q", "--verify", "HEAD")
-	cmd.Dir = path
-	_, err := cmd.CombinedOutput()
-	if err != nil {
-		return fmt.Errorf("sketch needs to run from within a git repo with at least one commit.\nRun: %s",
-			"git commit --allow-empty -m 'initial commit'")
-	}
-	return nil
-}
-
 // requireGitRepo confirms that path is within a git repository.
 func requireGitRepo(ctx context.Context, path string) error {
 	cmd := exec.CommandContext(ctx, "git", "rev-parse", "--git-dir")