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.
|
||||
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,
|
||||
// and instructs 'git lfs migrate' to migrate all local references.
|
||||
migrateEverything bool
|
||||
@ -174,14 +179,22 @@ func getRemoteRefs(l *log.Logger) ([]*git.Ref, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
w := l.Waiter("migrate: Fetching remote refs")
|
||||
if err := git.Fetch(remotes...); err != nil {
|
||||
return nil, err
|
||||
if !migrateSkipFetch {
|
||||
w := l.Waiter("migrate: Fetching remote refs")
|
||||
if err := git.Fetch(remotes...); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
w.Complete()
|
||||
}
|
||||
w.Complete()
|
||||
|
||||
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 {
|
||||
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(&migrateExcludeRefs, "exclude-ref", nil, "An explicit list of refs to exclude")
|
||||
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)
|
||||
})
|
||||
|
@ -27,6 +27,11 @@ git-lfs-migrate(1) - Migrate history to or from git-lfs
|
||||
* `--exclude-ref`=<refname>:
|
||||
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`:
|
||||
See [INCLUDE AND EXCLUDE (REFS)].
|
||||
|
||||
|
@ -202,6 +202,47 @@ begin_test "migrate import (given branch, exclude remote refs)"
|
||||
)
|
||||
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)"
|
||||
(
|
||||
set -e
|
||||
|
@ -132,6 +132,33 @@ begin_test "migrate info (given branch, exclude remote refs)"
|
||||
)
|
||||
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)"
|
||||
(
|
||||
set -e
|
||||
|
Loading…
Reference in New Issue
Block a user