检查 git 存储库中是否有远程存储库中不存在的内容

检查 git 存储库中是否有远程存储库中不存在的内容

给定一个 git 存储库maybe-old和一个远程central-repository

有没有办法快速(自动)检查中存在maybe-old但不存在的提交或其他内容central-repository

我想知道是否可以maybe-old在不丢失信息的情况下删除,包括未合并或推送到远程的任何本地分支或标签。

答案1

首先,这要视情况而定。如果你使用了基于 rebase 的工作流程,那么显而易见的方法将不起作用,你需要一些更复杂的东西。但是,如果你可以接受这个限制,那么我会这样做(仅经过轻微测试):

#!/bin/sh

tmpdir=$(mktemp -d)

# Make sure we have all of the objects from the remote repository.
git fetch central-repository

# Enumerate each revision reachable from a ref under refs/heads and
# refs/tags and save it in a file.
git ls-remote central-repository refs/heads/* refs/tags/* | awk '{print $1}' | \
    xargs git rev-list > $tmpdir/remote-revs

# Enumerate the commit for each ref in this repository and find any
# that are not in the list of remote revisions.
if git for-each-ref | awk '{print $1}' | grep -f $tmpdir/remote-revs -qsvF
then
    echo "Oh, no!  Missing commits!"
else
    echo "Up to date."
fi

如果您使用了基于 rebase 的工作流程,那么您的生活将变得更加困难。您可能能够git rev-list --objects在两种情况下找到两侧的所有对象并进行比较,但如果您的更改已合并但 blob 不完全相同,您仍然可能会遇到问题。您可以git cherry在这种情况下尝试,但它也有局限性,可能会将提交标记为缺失,而实际上并非如此。

相关内容