我正在将 git 存储库从 Azure DevOps 移动到 GitHub。 计划是从 Azure
git clone mirror
将 URL 重定向到 GitHub,然后推送到那里。目前为止没问题。
在许多其他存储库中用作子模块的一个存储库遗憾地添加了一个巨大的文件(~250M),而没有配置
lfs
。这使得 GitHub 拒绝推送。
我知道如何删除此文件并重写历史记录,但这会破坏引用存储库和子模块之间的历史引用。
在离开 Azure 之前,我可以在所有引用存储库上遍历该子模块的提交,并在引用存储库和子模块存储库上应用相同的标签吗?
我正在寻找某种方法来编写脚本/自动化此操作,因为我面临着很多提交。
非常欢迎实现相同目标的其他方法(迁移到具有完整历史记录的 GitHub)。
我构建了这个解决方案,在父存储库和子存储库上添加“同步标签”:
$mainrepo = "repo-name"
$subrepo = "subrepo-name"
$subPath = "path-to-submodule"
$baseTag = "$mainrepo/$subrepo"
# Get the list of commits from git rev-list
$commits = git rev-list HEAD --oneline $subPath
# Reverse the order of commits correctly
$reversedCommits = @($commits)
[Array]::Reverse($reversedCommits)
$counter = 0
# Iterate over each commit entry
foreach ($commit in $reversedCommits) {
# Split by the first space
$splitText = $commit -split ' ', 2
# The first part is the commit SHA
$commitSha = $splitText[0]
$counter += 1
$tag = "$baseTag/$counter"
# Output the commit SHA and counter
Write-Output "$commitSha $tag $($splitText[1])"
git checkout $commitSha
# Check if the tag already exists in the main repository
if (-not (git tag --list $tag)) {
git tag $tag
} else {
Write-Output "Tag $tag already exists in main repository, skipping."
}
git submodule update $subPath
Push-Location $subPath
# Check if the tag already exists in the submodule
if (-not (git tag --list $tag)) {
git tag $tag
} else {
Write-Output "Tag $tag already exists in submodule, skipping."
}
Pop-Location
}