如何检测是否对git repo进行了任何更改?

时间:2016-08-07 21:54:28

标签: git backup

我的目标是仅在最近的备份不再有效时才在UI中提供“备份回购”选项,因此我需要一种有效的方法来确定是否对该回购进行了任何更改。

我的第一个想法是将repo中每个目录的修改时间散列在一起,我将与备份中计算的相同值进行比较。那会有用吗?还有更好的方法吗?

3 个答案:

答案 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