git 用另一个远程备份一个远程仓库

git backup a remote repository with another remote

我在 github 上有一个远程存储库和另一个用于备份的远程存储库。 由于存储库非常大,我不想每次都使用 git push --mirror (它超过 20GB)并且每次都只想同步最新的更改。

我想写一个脚本来做这样的事情:

for each branch in githubRemote/branches do:
  if branch != otherRemote/branch:
     checkout githubRemote/branch
     push branch to otherRemote

转到您的备份存储库并执行 git fetch origingit pull origin

编辑:
我对 TFS 了解不多,但也许你可以在那里安排任务?
如果没有,也许它有一个 API 将触发 git pullgit fetch,因此您可以编写一个脚本调用正确的端点来执行此操作并将其安排在其他机器上。

您可以在 powershell 脚本中查看以下示例:

git clone htpp://githubRemote/repoName -q #clone remote repository on github

cd repoName 

$branches = git branch -r  | foreach{ $_ -replace "^.*?\/", "" } | where {$_ -notmatch "HEAD" }
 
foreach($branch in $branches)
{
    git checkout $branch -q
    $message = git pull origin 

    if($message -ne "Already up to date.")
    {
      git push http://PAT@tfs2015:8081/tfs/DefaultCollection/project/_git/repo $branch
    
     #you can also use your username:password as credentials
     #if your password or username contain @ replace it with %40
     #git push http://username:password@tfs2015:8081/tfs/DefaultCollection/project/_git/repo $branch 
     
    }
 }

以上脚本将克隆远程 github 存储库并检查所有分支,然后从远程 github 存储库中提取最新代码。如果对远程 github 分支进行了更改,则只有这些分支将被推送到另一个远程 tfs 存储库。

如果您使用 tfs 帐户 username:password 作为凭据。您的帐户需要具有参与远程 tfs 存储库的权限。如果您没有访问权限,请让您的 tfs 项目管理员授予您权限。

您也可以要求您的 tfs 项目管理员提供代码为 read/write 的 Personal access token(PAT)。然后您可以使用 PAT 作为凭据。

根据@Levi Lu-MSFT的回答,我写了这个脚本:

git checkout master
git reset --hard

$branches = git branch -r  | foreach{ $_ -replace "^.*?\/", "" } | where {$_ -notmatch "HEAD" }
 
foreach($branch in $branches)
{
   
    $branchBackupHash = git rev-parse remoteTFS/$branch
    $branchWorkingHash = git rev-parse remoteGithub/$branch
    #check if the commit hash is the same
    if($branchBackupHash -ne $branchWorkingHash)
    {
      echo updating branch $branch
      git checkout origin/$branch -q
      git pull origin $branch
      git push remoteTFS $branch
    }
 }