给定一个 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
在这种情况下尝试,但它也有局限性,可能会将提交标记为缺失,而实际上并非如此。