diff --git a/cmake/GetPastisGitRevision.cmake b/cmake/GetPastisGitRevision.cmake
index 6fe87b3eb00692f97df344246eb2addae2886c87..39396dca1f1d30b99b2acc43826b75d0649d2c38 100644
--- a/cmake/GetPastisGitRevision.cmake
+++ b/cmake/GetPastisGitRevision.cmake
@@ -3,14 +3,49 @@
 list(APPEND CMAKE_MODULE_PATH "${PASTIS_SOURCE_DIR}/cmake/cmake-modules")
 include(GetGitRevisionDescription)
 
-git_describe(PASTIS_GIT_TAG "--abbrev=0")
-get_git_head_revision(PASTIS_GIT_HEAD PASTIS_GIT_HASH)
-git_local_changes(PASTIS_GIT_HAS_LOCAL_CHANGES)
+set(HAS_PASTIS_GIT_INFO "TRUE")
 
-if(${PASTIS_GIT_HAS_LOCAL_CHANGES} STREQUAL "CLEAN")
-  set(PASTIS_GIT_IS_CLEAN true)
+find_package(Git QUIET)
+
+if(GIT_FOUND)
+  execute_process(
+    COMMAND "${GIT_EXECUTABLE}" describe "--abbrev=0"
+    WORKING_DIRECTORY "${PASTIS_SOURCE_DIR}"
+    OUTPUT_VARIABLE PASTIS_GIT_TAG
+    RESULT_VARIABLE FOUND_PASTIS_GIT_INFO
+    OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+  if(FOUND_PASTIS_GIT_INFO EQUAL 0)
+    execute_process(
+      COMMAND "${GIT_EXECUTABLE}" reflog -1 "--format=%H"
+      WORKING_DIRECTORY "${PASTIS_SOURCE_DIR}"
+      OUTPUT_VARIABLE PASTIS_GIT_HASH
+      OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+    execute_process(
+      COMMAND "${GIT_EXECUTABLE}" symbolic-ref HEAD
+      WORKING_DIRECTORY "${PASTIS_SOURCE_DIR}"
+      OUTPUT_VARIABLE PASTIS_GIT_HEAD
+      OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+    execute_process(
+      COMMAND "${GIT_EXECUTABLE}" diff-index --quiet HEAD
+      WORKING_DIRECTORY "${PASTIS_SOURCE_DIR}"
+      RESULT_VARIABLE STATE
+      OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+    if(STATE EQUAL 0)
+      set(PASTIS_GIT_HAS_LOCAL_CHANGES "CLEAN")
+      set(PASTIS_GIT_IS_CLEAN true)
+    else()
+      set(PASTIS_GIT_IS_CLEAN false)
+      set(PASTIS_GIT_HAS_LOCAL_CHANGES "DIRTY")
+    endif()
+  else()
+    unset(HAS_PASTIS_GIT_INFO)
+  endif()
 else()
-  set(PASTIS_GIT_IS_CLEAN false)
+  unset(HAS_PASTIS_GIT_INFO)
 endif()
 
 string(FIND "${PASTIS_GIT_TAG}" "${CMAKE_PASTIS_VERSION}" FOUND_VERSION_SUBSTR)
diff --git a/utils/RevisionInfo.cpp b/utils/RevisionInfo.cpp
index fd1bbc59f16e1bb78ddcaaa66cd8a1f73fad47d9..f508dec33c4894c682dc65a67059063a67b14620 100644
--- a/utils/RevisionInfo.cpp
+++ b/utils/RevisionInfo.cpp
@@ -7,22 +7,48 @@ std::string RevisionInfo::version()
   return PASTIS_VERSION;
 }
 
+bool RevisionInfo::hasGitInfo()
+{
+#ifdef HAS_PASTIS_GIT_INFO
+  return true;
+#else
+  return false;
+#endif
+}
+
 std::string RevisionInfo::gitTag()
 {
+#ifdef HAS_PASTIS_GIT_INFO
   return PASTIS_GIT_TAG;
+#else
+  return "unknown tag";
+#endif
 }
 
 std::string RevisionInfo::gitHead()
 {
+#ifdef HAS_PASTIS_GIT_INFO
   return PASTIS_GIT_HEAD;
+#else
+  return "unknown head";
+#endif
 }
 
 std::string RevisionInfo::gitHash()
 {
+#ifdef HAS_PASTIS_GIT_INFO
   return PASTIS_GIT_HASH;
+#else
+  return "unknown hash";
+#endif
 }
 
 bool RevisionInfo::gitIsClean()
 {
+#ifdef HAS_PASTIS_GIT_INFO
   return PASTIS_GIT_IS_CLEAN;
+#else
+  return false;
+#endif
 }
+
diff --git a/utils/RevisionInfo.hpp b/utils/RevisionInfo.hpp
index b0d547bd6ace63bc0690e336ee0fb150de959660..bff12f2011eba0e15e49af89841c5ddd08b55c8f 100644
--- a/utils/RevisionInfo.hpp
+++ b/utils/RevisionInfo.hpp
@@ -6,6 +6,8 @@
 struct RevisionInfo
 {
   static std::string version();
+
+  static bool hasGitInfo();
   static std::string gitTag();
   static std::string gitHead();
   static std::string gitHash();
diff --git a/utils/pastis_git_revision.hpp.in b/utils/pastis_git_revision.hpp.in
index fe0b3e6df860b7d8c28a0d52957f9fbc815c36df..89f7c62f0ec0212fa22ac25bd0b7747d5ba36492 100644
--- a/utils/pastis_git_revision.hpp.in
+++ b/utils/pastis_git_revision.hpp.in
@@ -1,6 +1,8 @@
 #ifndef PASTIS_GIT_REVISION_HPP
 #define PASTIS_GIT_REVISION_HPP
 
+#cmakedefine HAS_PASTIS_GIT_INFO
+
 #define PASTIS_GIT_TAG  "@PASTIS_GIT_TAG@"
 #define PASTIS_GIT_HEAD "@PASTIS_GIT_HEAD@"
 #define PASTIS_GIT_HASH "@PASTIS_GIT_HASH@"