Merge pull request #2738 from git-lfs/migrate-assume-current

commands/migrate: add '--skip-fetch' for offline migrations
This commit is contained in:
Taylor Blau 2017-11-20 13:55:41 -05:00 committed by GitHub
commit 55ad7269d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 92 additions and 5 deletions

@ -21,6 +21,11 @@ var (
// in the migration. // in the migration.
migrateExcludeRefs []string migrateExcludeRefs []string
// migrateSkipFetch assumes that the client has the latest copy of
// remote references, and thus should not contact the remote for a set
// of updated references.
migrateSkipFetch bool
// migrateEverything indicates the presence of the --everything flag, // migrateEverything indicates the presence of the --everything flag,
// and instructs 'git lfs migrate' to migrate all local references. // and instructs 'git lfs migrate' to migrate all local references.
migrateEverything bool migrateEverything bool
@ -174,14 +179,22 @@ func getRemoteRefs(l *log.Logger) ([]*git.Ref, error) {
return nil, err return nil, err
} }
if !migrateSkipFetch {
w := l.Waiter("migrate: Fetching remote refs") w := l.Waiter("migrate: Fetching remote refs")
if err := git.Fetch(remotes...); err != nil { if err := git.Fetch(remotes...); err != nil {
return nil, err return nil, err
} }
w.Complete() w.Complete()
}
for _, remote := range remotes { for _, remote := range remotes {
refsForRemote, err := git.RemoteRefs(remote) var refsForRemote []*git.Ref
if migrateSkipFetch {
refsForRemote, err = git.CachedRemoteRefs(remote)
} else {
refsForRemote, err = git.RemoteRefs(remote)
}
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -259,6 +272,7 @@ func init() {
cmd.PersistentFlags().StringSliceVar(&migrateIncludeRefs, "include-ref", nil, "An explicit list of refs to include") cmd.PersistentFlags().StringSliceVar(&migrateIncludeRefs, "include-ref", nil, "An explicit list of refs to include")
cmd.PersistentFlags().StringSliceVar(&migrateExcludeRefs, "exclude-ref", nil, "An explicit list of refs to exclude") cmd.PersistentFlags().StringSliceVar(&migrateExcludeRefs, "exclude-ref", nil, "An explicit list of refs to exclude")
cmd.PersistentFlags().BoolVar(&migrateEverything, "everything", false, "Migrate all local references") cmd.PersistentFlags().BoolVar(&migrateEverything, "everything", false, "Migrate all local references")
cmd.PersistentFlags().BoolVar(&migrateSkipFetch, "skip-fetch", false, "Assume up-to-date remote references.")
cmd.AddCommand(importCmd, info) cmd.AddCommand(importCmd, info)
}) })

@ -27,6 +27,11 @@ git-lfs-migrate(1) - Migrate history to or from git-lfs
* `--exclude-ref`=<refname>: * `--exclude-ref`=<refname>:
See [INCLUDE AND EXCLUDE (REFS)]. See [INCLUDE AND EXCLUDE (REFS)].
* `--skip-fetch`:
Assumes that the known set of remote references is complete, and should not
be refreshed when determining the set of "un-pushed" commits to migrate. Has
no effect when combined with `--include-ref` or `--exclude-ref`.
* `--everything`: * `--everything`:
See [INCLUDE AND EXCLUDE (REFS)]. See [INCLUDE AND EXCLUDE (REFS)].

@ -202,6 +202,47 @@ begin_test "migrate import (given branch, exclude remote refs)"
) )
end_test end_test
begin_test "migrate import (given ref, --skip-fetch)"
(
set -e
setup_single_remote_branch
md_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.md")")"
md_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.md")")"
txt_master_oid="$(calc_oid "$(git cat-file -p "refs/heads/master:a.txt")")"
txt_remote_oid="$(calc_oid "$(git cat-file -p "refs/remotes/origin/master:a.txt")")"
git tag pseudo-remote "$(git rev-parse refs/remotes/origin/master)"
# Remove the refs/remotes/origin/master ref, and instruct 'git lfs migrate' to
# not fetch it.
git update-ref -d refs/remotes/origin/master
git lfs migrate import --skip-fetch
assert_pointer "refs/heads/master" "a.md" "$md_master_oid" "50"
assert_pointer "pseudo-remote" "a.md" "$md_remote_oid" "140"
assert_pointer "refs/heads/master" "a.txt" "$txt_master_oid" "30"
assert_pointer "pseudo-remote" "a.txt" "$txt_remote_oid" "120"
assert_local_object "$md_master_oid" "50"
assert_local_object "$txt_master_oid" "30"
assert_local_object "$md_remote_oid" "140"
assert_local_object "$txt_remote_oid" "120"
master="$(git rev-parse refs/heads/master)"
remote="$(git rev-parse pseudo-remote)"
master_attrs="$(git cat-file -p "$master:.gitattributes")"
remote_attrs="$(git cat-file -p "$remote:.gitattributes")"
echo "$master_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$master_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
echo "$remote_attrs" | grep -q "*.md filter=lfs diff=lfs merge=lfs"
echo "$remote_attrs" | grep -q "*.txt filter=lfs diff=lfs merge=lfs"
)
end_test
begin_test "migrate import (include/exclude ref)" begin_test "migrate import (include/exclude ref)"
( (
set -e set -e

@ -132,6 +132,33 @@ begin_test "migrate info (given branch, exclude remote refs)"
) )
end_test end_test
begin_test "migrate info (given ref, --skip-fetch)"
(
set -e
setup_single_remote_branch
original_remote="$(git rev-parse refs/remotes/origin/master)"
original_master="$(git rev-parse refs/heads/master)"
git tag pseudo-remote "$original_remote"
# Remove the refs/remotes/origin/master ref, and instruct 'git lfs migrate' to
# not fetch it.
git update-ref -d refs/remotes/origin/master
diff -u <(git lfs migrate info --skip-fetch 2>&1 | tail -n 2) <(cat <<-EOF
*.md 190 B 2/2 files(s) 100%
*.txt 150 B 2/2 files(s) 100%
EOF)
migrated_remote="$(git rev-parse pseudo-remote)"
migrated_master="$(git rev-parse refs/heads/master)"
assert_ref_unmoved "refs/remotes/origin/master" "$original_remote" "$migrated_remote"
assert_ref_unmoved "refs/heads/master" "$original_master" "$migrated_master"
)
end_test
begin_test "migrate info (include/exclude ref)" begin_test "migrate info (include/exclude ref)"
( (
set -e set -e