diff --git a/gogs.go b/gogs.go
index 08421f005..315297b10 100644
--- a/gogs.go
+++ b/gogs.go
@@ -49,6 +49,7 @@ func main() {
 	app.Commands = []cli.Command{
 		CmdWeb,
 		CmdServ,
+		CmdUpdate,
 	}
 	app.Flags = append(app.Flags, []cli.Flag{}...)
 	app.Run(os.Args)
diff --git a/models/action.go b/models/action.go
index 6a77d7300..93c1e2768 100644
--- a/models/action.go
+++ b/models/action.go
@@ -43,7 +43,22 @@ func (a Action) GetRepoName() string {
 	return a.RepoName
 }
 
+func CommitRepoAction(userId int64, userName string,
+	repoId int64, repoName string, msg string) error {
+	_, err := orm.InsertOne(&Action{
+		UserId:      userId,
+		ActUserId:   userId,
+		ActUserName: userName,
+		OpType:      OP_COMMIT_REPO,
+		Content:     msg,
+		RepoId:      repoId,
+		RepoName:    repoName,
+	})
+	return err
+}
+
 // NewRepoAction inserts action for create repository.
+
 func NewRepoAction(user *User, repo *Repository) error {
 	_, err := orm.InsertOne(&Action{
 		UserId:      user.Id,
diff --git a/serve.go b/serve.go
index 68455de3d..0289c82c3 100644
--- a/serve.go
+++ b/serve.go
@@ -73,6 +73,17 @@ func runServ(*cli.Context) {
 	if strings.HasSuffix(repoName, ".git") {
 		repoName = repoName[:len(repoName)-4]
 	}
+
+	os.Setenv("userName", user.Name)
+	os.Setenv("userId", strconv.Itoa(int(user.Id)))
+	repo, err := models.GetRepositoryByName(user, repoName)
+	if err != nil {
+		println("Unavilable repository", err)
+		return
+	}
+	os.Setenv("repoId", strconv.Itoa(int(repo.Id)))
+	os.Setenv("repoName", repoName)
+
 	isWrite := In(verb, COMMANDS_WRITE)
 	isRead := In(verb, COMMANDS_READONLY)
 
diff --git a/update.go b/update.go
new file mode 100644
index 000000000..339b3ab94
--- /dev/null
+++ b/update.go
@@ -0,0 +1,51 @@
+package main
+
+import (
+	"os"
+	"strconv"
+
+	"github.com/gogits/gogs/models"
+
+	"github.com/codegangsta/cli"
+	git "github.com/gogits/git"
+)
+
+var CmdUpdate = cli.Command{
+	Name:  "update",
+	Usage: "This command just should be called by ssh shell",
+	Description: `
+gogs serv provide access auth for repositories`,
+	Action: runUpdate,
+	Flags:  []cli.Flag{},
+}
+
+func runUpdate(*cli.Context) {
+	userName := os.Getenv("userName")
+	userId := os.Getenv("userId")
+	repoId := os.Getenv("repoId")
+	repoName := os.Getenv("repoName")
+
+	f := models.RepoPath(userName, repoName)
+
+	repo, err := git.OpenRepository(f)
+	if err != nil {
+		return
+	}
+
+	ref, err := repo.LookupReference("HEAD")
+	if err != nil {
+		return
+	}
+
+	lastCommit, err := repo.LookupCommit(ref.Oid)
+	if err != nil {
+		return
+	}
+	sUserId, _ := strconv.Atoi(userId)
+	sRepoId, _ := strconv.Atoi(repoId)
+	err = models.CommitRepoAction(int64(sUserId), userName,
+		int64(sRepoId), repoName, lastCommit.Message())
+	if err != nil {
+		//TODO: log
+	}
+}