diff --git a/cmd/web.go b/cmd/web.go
index 51f146f37..3c25b9df2 100644
--- a/cmd/web.go
+++ b/cmd/web.go
@@ -25,6 +25,7 @@ import (
 	"github.com/macaron-contrib/oauth2"
 	"github.com/macaron-contrib/session"
 	"github.com/macaron-contrib/toolbox"
+	"gopkg.in/ini.v1"
 
 	api "github.com/gogits/go-gogs-client"
 
@@ -79,6 +80,7 @@ func checkVersion() {
 		{"github.com/macaron-contrib/csrf", csrf.Version, "0.0.1"},
 		{"github.com/macaron-contrib/i18n", i18n.Version, "0.0.5"},
 		{"github.com/macaron-contrib/session", session.Version, "0.1.1"},
+		{"gopkg.in/ini.v1", ini.Version, "1.0.1"},
 	}
 	for _, c := range checkers {
 		ver := strings.Join(strings.Split(c.Version(), ".")[:3], ".")
diff --git a/conf/app.ini b/conf/app.ini
index 467b43036..c191d105c 100644
--- a/conf/app.ini
+++ b/conf/app.ini
@@ -260,14 +260,20 @@ DRIVER =
 CONN =
 
 [git]
-MAX_GITDIFF_LINES = 10000
-; Arguments for command 'git fsck', e.g.: "--unreachable --tags"
-; see more on http://git-scm.com/docs/git-fsck/1.7.5
-FSCK_ARGS = 
+MAX_GIT_DIFF_LINES = 10000
 ; Arguments for command 'git gc', e.g.: "--aggressive --auto"
 ; see more on http://git-scm.com/docs/git-gc/1.7.5
 GC_ARGS = 
 
+; Git health check.
+[git.fsck]
+ENABLE = true
+; Execution interval in hours. Default is 24.
+INTERVAL = 24
+; Arguments for command 'git fsck', e.g.: "--unreachable --tags"
+; see more on http://git-scm.com/docs/git-fsck/1.7.5
+ARGS = 
+
 [i18n]
 LANGS = en-US,zh-CN,zh-HK,de-DE,fr-CA,nl-NL,lv-LV
 NAMES = English,简体中文,繁體中文,Deutsch,Français,Nederlands,Latviešu
diff --git a/models/repo.go b/models/repo.go
index 77c4b140d..65689b6a1 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -1228,7 +1228,7 @@ func GitFsck() {
 	isGitFscking = true
 	defer func() { isGitFscking = false }()
 
-	args := append([]string{"fsck"}, setting.GitFsckArgs...)
+	args := append([]string{"fsck"}, setting.Git.Fsck.Args...)
 	if err := x.Where("id > 0").Iterate(new(Repository),
 		func(idx int, bean interface{}) error {
 			repo := bean.(*Repository)
@@ -1252,7 +1252,7 @@ func GitFsck() {
 }
 
 func GitGcRepos() error {
-	args := append([]string{"gc"}, setting.GitGcArgs...)
+	args := append([]string{"gc"}, setting.Git.GcArgs...)
 	return x.Where("id > 0").Iterate(new(Repository),
 		func(idx int, bean interface{}) error {
 			repo := bean.(*Repository)
diff --git a/modules/cron/manager.go b/modules/cron/manager.go
index 49b1a99ce..135fec4fa 100644
--- a/modules/cron/manager.go
+++ b/modules/cron/manager.go
@@ -16,7 +16,9 @@ var c = New()
 func NewCronContext() {
 	c.AddFunc("Update mirrors", "@every 1h", models.MirrorUpdate)
 	c.AddFunc("Deliver hooks", fmt.Sprintf("@every %dm", setting.WebhookTaskInterval), models.DeliverHooks)
-	c.AddFunc("Repository health check", "@every 1h", models.GitFsck)
+	if setting.Git.Fsck.Enable {
+		c.AddFunc("Repository health check", fmt.Sprintf("@every %dh", setting.Git.Fsck.Interval), models.GitFsck)
+	}
 	c.Start()
 }
 
diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index c4d3d3a6c..bc9da3c63 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -107,9 +107,15 @@ var (
 	SessionConfig session.Options
 
 	// Git settings.
-	MaxGitDiffLines int
-	GitFsckArgs     []string
-	GitGcArgs       []string
+	Git struct {
+		MaxGitDiffLines int
+		GcArgs          []string `delim:" "`
+		Fsck            struct {
+			Enable   bool
+			Interval int
+			Args     []string `delim:" "`
+		} `ini:"git.fsck"`
+	}
 
 	// I18n settings.
 	Langs, Names []string
@@ -174,6 +180,7 @@ func NewConfigContext() {
 	} else {
 		log.Warn("No custom 'conf/app.ini' found, please go to '/install'")
 	}
+	Cfg.NameMapper = ini.AllCapsUnderscore
 
 	LogRootPath = Cfg.Section("log").Key("ROOT_PATH").MustString(path.Join(workDir, "log"))
 
@@ -291,10 +298,9 @@ func NewConfigContext() {
 	}
 	DisableGravatar = sec.Key("DISABLE_GRAVATAR").MustBool()
 
-	sec = Cfg.Section("git")
-	MaxGitDiffLines = sec.Key("MAX_GITDIFF_LINES").MustInt(10000)
-	GitFsckArgs = sec.Key("FSCK_ARGS").Strings(" ")
-	GitGcArgs = sec.Key("GC_ARGS").Strings(" ")
+	if err = Cfg.Section("git").MapTo(&Git); err != nil {
+		log.Fatal(4, "Fail to map Git settings: %v", err)
+	}
 
 	Langs = Cfg.Section("i18n").Key("LANGS").Strings(",")
 	Names = Cfg.Section("i18n").Key("NAMES").Strings(",")
diff --git a/routers/repo/commit.go b/routers/repo/commit.go
index 619c6c815..4571b24f2 100644
--- a/routers/repo/commit.go
+++ b/routers/repo/commit.go
@@ -208,7 +208,7 @@ func Diff(ctx *middleware.Context) {
 	commit := ctx.Repo.Commit
 	commit.CommitMessage = string(base.RenderIssueIndexPattern([]byte(commit.CommitMessage), ctx.Repo.RepoLink))
 	diff, err := models.GetDiffCommit(models.RepoPath(userName, repoName),
-		commitId, setting.MaxGitDiffLines)
+		commitId, setting.Git.MaxGitDiffLines)
 	if err != nil {
 		ctx.Handle(404, "GetDiffCommit", err)
 		return
@@ -272,7 +272,7 @@ func CompareDiff(ctx *middleware.Context) {
 	}
 
 	diff, err := models.GetDiffRange(models.RepoPath(userName, repoName), beforeCommitId,
-		afterCommitId, setting.MaxGitDiffLines)
+		afterCommitId, setting.Git.MaxGitDiffLines)
 	if err != nil {
 		ctx.Handle(404, "GetDiffRange", err)
 		return