diff --git a/models/action.go b/models/action.go
index 4b0a55921b1..9bf2905c99c 100644
--- a/models/action.go
+++ b/models/action.go
@@ -17,6 +17,7 @@ import (
 	"unicode"
 
 	"code.gitea.io/gitea/modules/base"
+	"code.gitea.io/gitea/modules/git"
 	"code.gitea.io/gitea/modules/log"
 	"code.gitea.io/gitea/modules/setting"
 	api "code.gitea.io/gitea/modules/structs"
@@ -385,7 +386,7 @@ func NewPushCommits() *PushCommits {
 
 // ToAPIPayloadCommits converts a PushCommits object to
 // api.PayloadCommit format.
-func (pc *PushCommits) ToAPIPayloadCommits(repoLink string) []*api.PayloadCommit {
+func (pc *PushCommits) ToAPIPayloadCommits(repoPath, repoLink string) ([]*api.PayloadCommit, error) {
 	commits := make([]*api.PayloadCommit, len(pc.Commits))
 
 	if pc.emailUsers == nil {
@@ -417,6 +418,12 @@ func (pc *PushCommits) ToAPIPayloadCommits(repoLink string) []*api.PayloadCommit
 		} else {
 			committerUsername = committer.Name
 		}
+
+		fileStatus, err := git.GetCommitFileStatus(repoPath, commit.Sha1)
+		if err != nil {
+			return nil, fmt.Errorf("FileStatus [commit_sha1: %s]: %v", commit.Sha1, err)
+		}
+
 		commits[i] = &api.PayloadCommit{
 			ID:      commit.Sha1,
 			Message: commit.Message,
@@ -431,10 +438,13 @@ func (pc *PushCommits) ToAPIPayloadCommits(repoLink string) []*api.PayloadCommit
 				Email:    commit.CommitterEmail,
 				UserName: committerUsername,
 			},
+			Added:     fileStatus.Added,
+			Removed:   fileStatus.Removed,
+			Modified:  fileStatus.Modified,
 			Timestamp: commit.Timestamp,
 		}
 	}
-	return commits
+	return commits, nil
 }
 
 // AvatarLink tries to match user in database with e-mail
@@ -738,7 +748,10 @@ func MirrorSyncPushAction(repo *Repository, opts MirrorSyncPushActionOptions) er
 		opts.Commits.Commits = opts.Commits.Commits[:setting.UI.FeedMaxCommitNum]
 	}
 
-	apiCommits := opts.Commits.ToAPIPayloadCommits(repo.HTMLURL())
+	apiCommits, err := opts.Commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL())
+	if err != nil {
+		return err
+	}
 
 	opts.Commits.CompareURL = repo.ComposeCompareURL(opts.OldCommitID, opts.NewCommitID)
 	apiPusher := repo.MustOwner().APIFormat()
diff --git a/models/action_test.go b/models/action_test.go
index 740976885e1..e2546044d46 100644
--- a/models/action_test.go
+++ b/models/action_test.go
@@ -85,42 +85,69 @@ func TestPushCommits_ToAPIPayloadCommits(t *testing.T) {
 	pushCommits := NewPushCommits()
 	pushCommits.Commits = []*PushCommit{
 		{
-			Sha1:           "abcdef1",
+			Sha1:           "69554a6",
 			CommitterEmail: "user2@example.com",
-			CommitterName:  "User Two",
-			AuthorEmail:    "user4@example.com",
-			AuthorName:     "User Four",
-			Message:        "message1",
+			CommitterName:  "User2",
+			AuthorEmail:    "user2@example.com",
+			AuthorName:     "User2",
+			Message:        "not signed commit",
 		},
 		{
-			Sha1:           "abcdef2",
+			Sha1:           "27566bd",
 			CommitterEmail: "user2@example.com",
-			CommitterName:  "User Two",
+			CommitterName:  "User2",
 			AuthorEmail:    "user2@example.com",
-			AuthorName:     "User Two",
-			Message:        "message2",
+			AuthorName:     "User2",
+			Message:        "good signed commit (with not yet validated email)",
+		},
+		{
+			Sha1:           "5099b81",
+			CommitterEmail: "user2@example.com",
+			CommitterName:  "User2",
+			AuthorEmail:    "user2@example.com",
+			AuthorName:     "User2",
+			Message:        "good signed commit",
 		},
 	}
 	pushCommits.Len = len(pushCommits.Commits)
 
-	payloadCommits := pushCommits.ToAPIPayloadCommits("/username/reponame")
-	if assert.Len(t, payloadCommits, 2) {
-		assert.Equal(t, "abcdef1", payloadCommits[0].ID)
-		assert.Equal(t, "message1", payloadCommits[0].Message)
-		assert.Equal(t, "/username/reponame/commit/abcdef1", payloadCommits[0].URL)
-		assert.Equal(t, "User Two", payloadCommits[0].Committer.Name)
-		assert.Equal(t, "user2", payloadCommits[0].Committer.UserName)
-		assert.Equal(t, "User Four", payloadCommits[0].Author.Name)
-		assert.Equal(t, "user4", payloadCommits[0].Author.UserName)
+	repo := AssertExistsAndLoadBean(t, &Repository{ID: 16}).(*Repository)
+	payloadCommits, err := pushCommits.ToAPIPayloadCommits(repo.RepoPath(), "/user2/repo16")
+	assert.NoError(t, err)
+	assert.EqualValues(t, 3, len(payloadCommits))
 
-		assert.Equal(t, "abcdef2", payloadCommits[1].ID)
-		assert.Equal(t, "message2", payloadCommits[1].Message)
-		assert.Equal(t, "/username/reponame/commit/abcdef2", payloadCommits[1].URL)
-		assert.Equal(t, "User Two", payloadCommits[1].Committer.Name)
-		assert.Equal(t, "user2", payloadCommits[1].Committer.UserName)
-		assert.Equal(t, "User Two", payloadCommits[1].Author.Name)
-		assert.Equal(t, "user2", payloadCommits[1].Author.UserName)
-	}
+	assert.Equal(t, "69554a6", payloadCommits[0].ID)
+	assert.Equal(t, "not signed commit", payloadCommits[0].Message)
+	assert.Equal(t, "/user2/repo16/commit/69554a6", payloadCommits[0].URL)
+	assert.Equal(t, "User2", payloadCommits[0].Committer.Name)
+	assert.Equal(t, "user2", payloadCommits[0].Committer.UserName)
+	assert.Equal(t, "User2", payloadCommits[0].Author.Name)
+	assert.Equal(t, "user2", payloadCommits[0].Author.UserName)
+	assert.EqualValues(t, []string{}, payloadCommits[0].Added)
+	assert.EqualValues(t, []string{}, payloadCommits[0].Removed)
+	assert.EqualValues(t, []string{"readme.md"}, payloadCommits[0].Modified)
+
+	assert.Equal(t, "27566bd", payloadCommits[1].ID)
+	assert.Equal(t, "good signed commit (with not yet validated email)", payloadCommits[1].Message)
+	assert.Equal(t, "/user2/repo16/commit/27566bd", payloadCommits[1].URL)
+	assert.Equal(t, "User2", payloadCommits[1].Committer.Name)
+	assert.Equal(t, "user2", payloadCommits[1].Committer.UserName)
+	assert.Equal(t, "User2", payloadCommits[1].Author.Name)
+	assert.Equal(t, "user2", payloadCommits[1].Author.UserName)
+	assert.EqualValues(t, []string{}, payloadCommits[1].Added)
+	assert.EqualValues(t, []string{}, payloadCommits[1].Removed)
+	assert.EqualValues(t, []string{"readme.md"}, payloadCommits[1].Modified)
+
+	assert.Equal(t, "5099b81", payloadCommits[2].ID)
+	assert.Equal(t, "good signed commit", payloadCommits[2].Message)
+	assert.Equal(t, "/user2/repo16/commit/5099b81", payloadCommits[2].URL)
+	assert.Equal(t, "User2", payloadCommits[2].Committer.Name)
+	assert.Equal(t, "user2", payloadCommits[2].Committer.UserName)
+	assert.Equal(t, "User2", payloadCommits[2].Author.Name)
+	assert.Equal(t, "user2", payloadCommits[2].Author.UserName)
+	assert.EqualValues(t, []string{"readme.md"}, payloadCommits[2].Added)
+	assert.EqualValues(t, []string{}, payloadCommits[2].Removed)
+	assert.EqualValues(t, []string{}, payloadCommits[2].Modified)
 }
 
 func TestPushCommits_AvatarLink(t *testing.T) {
diff --git a/modules/repofiles/action.go b/modules/repofiles/action.go
index ac5df9a14f0..9467e4fb72f 100644
--- a/modules/repofiles/action.go
+++ b/modules/repofiles/action.go
@@ -193,12 +193,16 @@ func CommitRepoAction(opts CommitRepoActionOptions) error {
 	}
 
 	if isHookEventPush {
+		commits, err := opts.Commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL())
+		if err != nil {
+			return err
+		}
 		if err = models.PrepareWebhooks(repo, models.HookEventPush, &api.PushPayload{
 			Ref:        opts.RefFullName,
 			Before:     opts.OldCommitID,
 			After:      opts.NewCommitID,
 			CompareURL: setting.AppURL + opts.Commits.CompareURL,
-			Commits:    opts.Commits.ToAPIPayloadCommits(repo.HTMLURL()),
+			Commits:    commits,
 			Repo:       apiRepo,
 			Pusher:     apiPusher,
 			Sender:     apiPusher,
diff --git a/modules/repofiles/action_test.go b/modules/repofiles/action_test.go
index 322c668dadf..9ae1042e22e 100644
--- a/modules/repofiles/action_test.go
+++ b/modules/repofiles/action_test.go
@@ -29,7 +29,7 @@ func TestCommitRepoAction(t *testing.T) {
 	}{
 		{
 			userID:       2,
-			repositoryID: 2,
+			repositoryID: 16,
 			commitRepoActionOptions: CommitRepoActionOptions{
 				RefFullName: "refName",
 				OldCommitID: "oldCommitID",
@@ -37,20 +37,20 @@ func TestCommitRepoAction(t *testing.T) {
 				Commits: &models.PushCommits{
 					Commits: []*models.PushCommit{
 						{
-							Sha1:           "abcdef1",
+							Sha1:           "69554a6",
 							CommitterEmail: "user2@example.com",
-							CommitterName:  "User Two",
-							AuthorEmail:    "user4@example.com",
-							AuthorName:     "User Four",
-							Message:        "message1",
+							CommitterName:  "User2",
+							AuthorEmail:    "user2@example.com",
+							AuthorName:     "User2",
+							Message:        "not signed commit",
 						},
 						{
-							Sha1:           "abcdef2",
+							Sha1:           "27566bd",
 							CommitterEmail: "user2@example.com",
-							CommitterName:  "User Two",
+							CommitterName:  "User2",
 							AuthorEmail:    "user2@example.com",
-							AuthorName:     "User Two",
-							Message:        "message2",
+							AuthorName:     "User2",
+							Message:        "good signed commit (with not yet validated email)",
 						},
 					},
 					Len: 2,