diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 6a1324683bfdd6bcee152baa2ba961946d3cacbc..a351299dcdfbe4f0b447c9d93e7685e0a3cd36db 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -794,6 +794,19 @@ QString GitClient::findGitDirForRepository(const QString &repositoryDir) const
     return res;
 }
 
+QString GitClient::findRepositoryForGitDir(const QString &gitDir) const
+{
+    static QHash<QString, QString> gitDirCache;
+    QString &res = gitDirCache[gitDir];
+    if (!res.isEmpty())
+        return res;
+    QByteArray outputText;
+    QStringList arguments;
+    arguments << QLatin1String("rev-parse") << QLatin1String("--show-toplevel");
+    fullySynchronousGit(gitDir, arguments, &outputText, 0, false);
+    return QString::fromLocal8Bit(outputText.trimmed());
+}
+
 VcsBase::VcsBaseEditorWidget *GitClient::findExistingVCSEditor(const char *registerDynamicProperty,
                                                                const QString &dynamicPropertyValue) const
 {
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 9dc1d936f73aafd64a745e8e7bc6deba9a944a1f..4b230594b62383566bbfbada4b2e5dbecf62f2d2 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -138,6 +138,7 @@ public:
 
     QString findRepositoryForDirectory(const QString &dir);
     QString findGitDirForRepository(const QString &repositoryDir) const;
+    QString findRepositoryForGitDir(const QString &gitDir) const;
 
     void diff(const QString &workingDirectory, const QStringList &diffArgs, const QString &fileName);
     void diff(const QString &workingDirectory, const QStringList &diffArgs,
diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp
index 2c6062799bfb884b4e800536a302d5af943bd294..1819fd7a34c7f505ed74ce4e5d0ba16ff16c4f16 100644
--- a/src/plugins/git/giteditor.cpp
+++ b/src/plugins/git/giteditor.cpp
@@ -235,6 +235,16 @@ void GitEditor::init()
         new GitSubmitHighlighter(baseTextDocument().data());
 }
 
+bool GitEditor::open(QString *errorString, const QString &fileName, const QString &realFileName)
+{
+    bool res = VcsBaseEditorWidget::open(errorString, fileName, realFileName);
+    if (editor()->id() == Git::Constants::GIT_COMMIT_TEXT_EDITOR_ID) {
+        QFileInfo fi(fileName);
+        setSource(GitPlugin::instance()->gitClient()->findRepositoryForGitDir(fi.absolutePath()));
+    }
+    return res;
+}
+
 QString GitEditor::decorateVersion(const QString &revision) const
 {
     const QFileInfo fi(source());
@@ -284,5 +294,11 @@ QString GitEditor::revisionSubject(const QTextBlock &inBlock) const
     return QString();
 }
 
+bool GitEditor::supportChangeLinks() const
+{
+    return VcsBaseEditorWidget::supportChangeLinks()
+            || (editor()->id() == Git::Constants::GIT_COMMIT_TEXT_EDITOR_ID);
+}
+
 } // namespace Internal
 } // namespace Git
diff --git a/src/plugins/git/giteditor.h b/src/plugins/git/giteditor.h
index 5010fd8193709f218eff3d664545ca1509555a83..b5539892c90cf76b9c2a42cc5edc220621f81518 100644
--- a/src/plugins/git/giteditor.h
+++ b/src/plugins/git/giteditor.h
@@ -60,6 +60,7 @@ private slots:
 
 private:
     void init();
+    bool open(QString *errorString, const QString &fileName, const QString &realFileName);
     QSet<QString> annotationChanges() const;
     QString changeUnderCursor(const QTextCursor &) const;
     VcsBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes, const QColor &bg) const;
@@ -68,6 +69,7 @@ private:
     bool isValidRevision(const QString &revision) const;
     void addChangeActions(QMenu *menu, const QString &change);
     QString revisionSubject(const QTextBlock &inBlock) const;
+    bool supportChangeLinks() const;
 
     mutable QRegExp m_changeNumberPattern;
     QString m_currentChange;
diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp
index ecf43b20056594241639c46be8a68838c1f820e2..00445b2375f94042a7997ed9dbbd633a47cf4e94 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.cpp
+++ b/src/plugins/vcsbase/vcsbaseeditor.cpp
@@ -663,6 +663,17 @@ void VcsBaseEditorWidget::setLogEntryPattern(const QRegExp &pattern)
     d->m_logEntryPattern = pattern;
 }
 
+bool VcsBaseEditorWidget::supportChangeLinks() const
+{
+    switch (d->m_parameters->type) {
+    case LogOutput:
+    case AnnotateOutput:
+        return true;
+    default:
+        return false;
+    }
+}
+
 void VcsBaseEditorWidget::init()
 {
     d->m_editor = editor();
@@ -963,7 +974,7 @@ void VcsBaseEditorWidget::mouseMoveEvent(QMouseEvent *e)
     bool overrideCursor = false;
     Qt::CursorShape cursorShape;
 
-    if (d->m_parameters->type == LogOutput || d->m_parameters->type == AnnotateOutput) {
+    if (supportChangeLinks()) {
         // Link emulation behaviour for 'click on change-interaction'
         const QTextCursor cursor = cursorForPosition(e->pos());
         Internal::AbstractTextCursorHandler *handler = d->findTextCursorHandler(cursor);
@@ -987,7 +998,7 @@ void VcsBaseEditorWidget::mouseReleaseEvent(QMouseEvent *e)
 {
     const bool wasDragging = d->m_mouseDragging;
     d->m_mouseDragging = false;
-    if (!wasDragging && (d->m_parameters->type == LogOutput || d->m_parameters->type == AnnotateOutput)) {
+    if (!wasDragging && supportChangeLinks()) {
         if (e->button() == Qt::LeftButton &&!(e->modifiers() & Qt::ShiftModifier)) {
             const QTextCursor cursor = cursorForPosition(e->pos());
             Internal::AbstractTextCursorHandler *handler = d->findTextCursorHandler(cursor);
diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h
index 955c194d901287a349aa9fe44a88b7d2fb7e842d..6971b701cf5e0b5a117f54f55bce07fa0f0af42f 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.h
+++ b/src/plugins/vcsbase/vcsbaseeditor.h
@@ -103,6 +103,7 @@ protected:
     void setDiffFilePattern(const QRegExp &pattern);
     // Pattern for log entry. hash/revision number must be in the first capture group
     void setLogEntryPattern(const QRegExp &pattern);
+    virtual bool supportChangeLinks() const;
 
 public:
     virtual void init();