Merge pull request #2738 from git-lfs/migrate-assume-current
commands/migrate: add '--skip-fetch' for offline migrations
This commit is contained in:
commit
55ad7269d8
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user