我的目标是仅在最近的备份不再有效时才在UI中提供“备份回购”选项,因此我需要一种有效的方法来确定是否对该回购进行了任何更改。
我的第一个想法是将repo中每个目录的修改时间散列在一起,我将与备份中计算的相同值进行比较。那会有用吗?还有更好的方法吗?
答案 0 :(得分:1)
你真的只想知道你的远程跟踪分支起源/分支是否(在获取之后)与你的本地跟踪分支相同,所以只需检查这样的SHA(然后进行合并以便赶上你)。所以你可能只是对origin / branch进行一次rev-parse并将其与分支的rev-parse进行比较,因为无论提交的次数或更改的位置无关紧要,只是有更改(或git log) --onon origin / branch..branch用管道输送到wc -l,有点像。)
您对整个目录的哈希的想法类似于实际计算提交的SHA的方式,因此只需使用SHA即可实现。请注意,如果有人进行了提交然后恢复,我的建议会失败,因此您将使用相同的内容,SHA会随着每次连续提交而更改(因为它们还包含提交信息以及父SHA),但是我认为这是一个不太可能的场景,而不是你需要优化的场景。
因此,我的方法假设您有一个本地仓库,您正在克隆远程。如果没有,或者您不想拉下整个远程仓库,您可以进行浅层克隆以获得提示并记住之前的提示。
然而,更好的方法是使用git ls-remote
并解析该输出并记住其状态,并在下次运行时对其进行比较。
NAME
git-ls-remote - List references in a remote repository
SYNOPSIS
git ls-remote [--heads] [--tags] [--upload-pack=<exec>]
[--exit-code] <repository> [<refs>...]
DESCRIPTION
Displays references available in a remote repository along with the associated commit IDs.
您将看到如下输出:
From https://github.com/foobar/myRepo.git
3133d81f8cca51c73c92aeeaa1c762b177683456 HEAD
3133d81f8cca51c73c92aeeaa1c762b177683456 refs/heads/master
所以你看到它列出了远程的HEAD以及它的refs,它只是解析并保存它。
答案 1 :(得分:0)
您可以解析...
的输出git fetch --dry-run origin
答案 2 :(得分:0)
...我的第一个想法是将repo中每个目录的修改时间散列在一起,我将与备份中计算的相同值进行比较。那会有用吗?还有更好的方法吗?
是的,您可以检查服务器是否有任何挂起的更改:
# grab all latest changes
git fetch
# check to see if there are any changes
git diff <origin/branch> ^branch
# or
git diff ^<branch> origin/branch
一个是拉动,第二个是推动
另一种方法是获取并计算每个分支中的提交数量,假设您没有进行交互式rebase [squash]。
git rev-list --count