func cloneCommand(cmd *cobra.Command, args []string) { // We pass all args to git clone err := git.CloneWithoutFilters(cloneFlags, args) if err != nil { Exit("Error(s) during clone:\n%v", err) } // now execute pull (need to be inside dir) cwd, err := os.Getwd() if err != nil { Exit("Unable to derive current working dir: %v", err) } // Either the last argument was a relative or local dir, or we have to // derive it from the clone URL clonedir, err := filepath.Abs(args[len(args)-1]) if err != nil || !tools.DirExists(clonedir) { // Derive from clone URL instead base := path.Base(args[len(args)-1]) if strings.HasSuffix(base, ".git") { base = base[:len(base)-4] } clonedir, _ = filepath.Abs(base) if !tools.DirExists(clonedir) { Exit("Unable to find clone dir at %q", clonedir) } } err = os.Chdir(clonedir) if err != nil { Exit("Unable to change directory to clone dir %q: %v", clonedir, err) } // Make sure we pop back to dir we started in at the end defer os.Chdir(cwd) // Also need to derive dirs now localstorage.ResolveDirs() requireInRepo() // Now just call pull with default args // Support --origin option to clone if len(cloneFlags.Origin) > 0 { config.Config.CurrentRemote = cloneFlags.Origin } else { config.Config.CurrentRemote = "origin" } if cloneFlags.NoCheckout || cloneFlags.Bare { // If --no-checkout or --bare then we shouldn't check out, just fetch instead fetchRef("HEAD", nil, nil) } else { pull(nil, nil) } }
// From a git dir, get the location that objects are to be stored (we will store lfs alongside) // Sometimes there is an additional level of redirect on the .git folder by way of a commondir file // before you find object storage, e.g. 'git worktree' uses this. It redirects to gitdir either by GIT_DIR // (during setup) or .git/git-dir: (during use), but this only contains the index etc, the objects // are found in another git dir via 'commondir'. func resolveGitStorageDir(gitDir string) string { commondirpath := filepath.Join(gitDir, "commondir") if tools.FileExists(commondirpath) && !tools.DirExists(filepath.Join(gitDir, "objects")) { // no git-dir: prefix in commondir storage, err := processGitRedirectFile(commondirpath, "") if err == nil { return storage } } return gitDir }
func resolveReferenceDir(gitStorageDir string) string { cloneReferencePath := filepath.Join(gitStorageDir, "objects", "info", "alternates") if tools.FileExists(cloneReferencePath) { buffer, err := ioutil.ReadFile(cloneReferencePath) if err == nil { path := strings.TrimSpace(string(buffer[:])) referenceLfsStoragePath := filepath.Join(filepath.Dir(path), "lfs", "objects") if tools.DirExists(referenceLfsStoragePath) { return referenceLfsStoragePath } } } return "" }