diff --git a/bench.py b/bench.py
index fa16854a16e512926c538466bf151ad7fcca65a8..9f4a6c127eb574d2590197cb935382baf02e4e8f 100755
--- a/bench.py
+++ b/bench.py
@@ -33,7 +33,7 @@ import src.globalvars
 from src.util import find_cmd
 from src.util import print_status, print_warn, print_error
 from src.util import print_info, print_info2, print_debug
-from src.util import print_license_and_exit, print_version_and_exit
+from src.util import print_license_and_exit
 
 
 def epilog():
@@ -46,7 +46,7 @@ def epilog():
         else:
             endtime = datetime.datetime.now().isoformat()
             endtime = endtime[:endtime.rfind(':')]
-            src.globalvars.facts["endtime"] = endtime
+            src.facter.FACTS["endtime"] = endtime
             src.facter.store_facts(src.globalvars.resdir)
 
     # remove a left over status file if some is present
@@ -116,7 +116,8 @@ def main():
         print_license_and_exit()
 
     if args.version:
-        print_version_and_exit()
+        print(src.facter.allocbench_version())
+        exit(0)
 
     atexit.register(epilog)
 
@@ -156,8 +157,8 @@ def main():
         src.globalvars.resdir = os.path.join(args.resultdir)
     else:
         src.globalvars.resdir = os.path.join("results",
-                                             src.globalvars.facts["hostname"],
-                                             src.globalvars.facts["starttime"])
+                                             src.facter.FACTS["hostname"],
+                                             src.facter.FACTS["starttime"])
 
     print_status("Writing results to:", src.globalvars.resdir)
     os.makedirs(src.globalvars.resdir, exist_ok=True)
diff --git a/merge.py b/merge.py
index 4812c37812d22d730bf7e1924d470efd139908b9..77fe73c63f98f72325d4d91cb0e6418dde30a040 100755
--- a/merge.py
+++ b/merge.py
@@ -25,7 +25,8 @@ import os
 import pickle
 import sys
 
-from src.util import print_license_and_exit, print_version_and_exit
+import src.facter
+from src.util import print_license_and_exit
 
 def load_file(filename):
     if filename.endswith("json"):
@@ -41,7 +42,8 @@ def main():
         print_license_and_exit()
 
     if "--version" in sys.argv:
-        print_version_and_exit()
+        print(src.facter.allocbench_version())
+        exit(0)
 
     parser = argparse.ArgumentParser(description="Merge to allocbench results")
     parser.add_argument("src", help="results which should be merged into dest", type=str)
diff --git a/src/benchmark.py b/src/benchmark.py
index bbb6d50b644b687b9232668d5ff940bf9eb913e4..905a11f27840f95f0d994f40629a9972d5bb7848 100644
--- a/src/benchmark.py
+++ b/src/benchmark.py
@@ -734,7 +734,7 @@ class Benchmark:
         print(comment_symbol, self.name, file=f)
         print(file=f)
         print(comment_symbol, "Common facts:", file=f)
-        for k, v in src.globalvars.facts.items():
+        for k, v in src.facter.FACTS.items():
             print(comment_symbol, k + ":", v, file=f)
         print(file=f)
         print(comment_symbol, "Benchmark facts:", file=f)
diff --git a/src/facter.py b/src/facter.py
index fe0b316803ad33fa716a03a663f51fb3469265d1..4c1c14d6b4e5d9bb832c8e08dd7650607d2b069a 100644
--- a/src/facter.py
+++ b/src/facter.py
@@ -26,31 +26,31 @@ import platform
 import subprocess
 
 import src.globalvars as gv
-from src.util import print_error, print_info
+from src.util import print_error, print_info, run_cmd
 
+FACTS = {}
 
 def collect_facts():
-    """Collect facts ad store them in src.globalvars.facts"""
+    """Collect general facts about the benchmark environment"""
     # Populate src.globalvars.facts on import
     _uname = platform.uname()
-    gv.facts["hostname"] = _uname.node
-    gv.facts["system"] = _uname.system
-    gv.facts["kernel"] = _uname.release
-    gv.facts["arch"] = _uname.machine
-    gv.facts["cpus"] = multiprocessing.cpu_count()
-    gv.facts["LD_PRELOAD"] = os.environ.get("LD_PRELOAD", None)
+    FACTS["hostname"] = _uname.node
+    FACTS["system"] = _uname.system
+    FACTS["kernel"] = _uname.release
+    FACTS["arch"] = _uname.machine
+    FACTS["cpus"] = multiprocessing.cpu_count()
+    FACTS["LD_PRELOAD"] = os.environ.get("LD_PRELOAD", None)
 
     with open(os.path.join(gv.builddir, "ccinfo"), "r") as ccinfo:
-        gv.facts["cc"] = ccinfo.readlines()[-1][:-1]
+        FACTS["cc"] = ccinfo.readlines()[-1][:-1]
 
-    gv.facts["allocbench"] = subprocess.run(["git", "rev-parse", "master"],
-                                            stdout=subprocess.PIPE,
-                                            universal_newlines=True).stdout
+    # get commit info from git
+    allocbench_version()
 
     starttime = datetime.datetime.now().isoformat()
     # strip seconds from string
     starttime = starttime[:starttime.rfind(':')]
-    gv.facts["starttime"] = starttime
+    FACTS["starttime"] = starttime
 
 
 def store_facts(path=None):
@@ -64,7 +64,7 @@ def store_facts(path=None):
 
     print_info(f"Saving facts to: {filename}")
     with open(filename, "w") as f:
-        json.dump(gv.facts, f)
+        json.dump(FACTS, f)
 
 
 def load_facts(path=None):
@@ -80,18 +80,31 @@ def load_facts(path=None):
     if os.path.exists(filename + ".json"):
         filename += ".json"
         with open(filename, "r") as f:
-            gv.facts = json.load(f)
+            FACTS = json.load(f)
     elif os.path.exists(filename + ".save"):
         import pickle
         filename += ".save"
         with open(filename, "rb") as f:
-            gv.facts = pickle.load(f)
+            FACTS = pickle.load(f)
     else:
         raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT),
                                 filename)
 
     print_info(f"Loading facts from: {filename}")
 
+def allocbench_version():
+    "Store and return allocbench version string."""
+    if "allocbench" in FACTS:
+        return FACTS["allocbench"]
+
+    commit = run_cmd(["git", "rev-parse", "HEAD"], capture=True).stdout[:-1]
+
+    proc = run_cmd(["git", "status", "--porcelain"], capture=True)
+    dirty = "-dirty" if proc.stdout != "" else ""
+
+    FACTS["allocbench"] = f"{commit}{dirty}"
+    return FACTS["allocbench"]
+
 
 # Copied from pip.
 # https://github.com/pypa/pip/blob/master/src/pip/_internal/utils/glibc.py
diff --git a/src/globalvars.py b/src/globalvars.py
index c1ec6b02cdf50242c708a9cff9615fce8d3e987a..bcb722b066163298fed326a8ab53c216c542ed06 100644
--- a/src/globalvars.py
+++ b/src/globalvars.py
@@ -17,7 +17,6 @@
 
 """Global variables for allocbench
 
-facts: Dict holding facts about the current benchmark run
 verbosity: Verbosity level -1: quiet, 0: status, 1: info, 2: stdout of subcommands, 3: debug info
 allocators: Dict holding the allocators to compare
 benchmarks: List of available benchmarks
@@ -35,8 +34,6 @@ import inspect
 import os
 
 
-facts = {}
-
 verbosity = 0
 
 allocators = {}
diff --git a/src/util.py b/src/util.py
index 618eaf86ebfb59488c133e63ac2be3ed028acb2a..c5074b6a86e88263aa02785df99e36fa6909176b 100644
--- a/src/util.py
+++ b/src/util.py
@@ -169,31 +169,6 @@ def print_license_and_exit():
     exit(0)
 
 
-def print_version_and_exit():
-    """Print current commit info before exit"""
-    proc = subprocess.run(["git", "rev-parse", "HEAD"],
-                          universal_newlines=True,
-                          stdout=subprocess.PIPE)
-
-    if proc.returncode != 0:
-        print_error("git rev-parse failed")
-        exit(1)
-    commit = proc.stdout[:-1]
-
-    proc = subprocess.run(["git", "status", "--porcelain"],
-                          universal_newlines=True,
-                          stdout=subprocess.PIPE)
-
-    if proc.returncode != 0:
-        print_error("git status --porcelain failed")
-        exit(1)
-
-    dirty = "-dirty" if proc.stdout != "" else ""
-
-    print(f"{commit}{dirty}")
-    exit(0)
-
-
 def sha1sum(filename):
     """Return sha1sum of a file"""
     sha1 = hashlib.sha1()
diff --git a/summarize.py b/summarize.py
index 6681137b37a72ef4dd7952488d14cff6fab0818f..d974fb200edd2af59da6f3fd8c48c290975c26e9 100755
--- a/summarize.py
+++ b/summarize.py
@@ -27,7 +27,7 @@ import sys
 import src.facter
 import src.globalvars
 from src.util import print_status, print_debug, print_error
-from src.util import print_license_and_exit, print_version_and_exit
+from src.util import print_license_and_exit
 
 
 def specific_summary(bench, sum_dir, allocators):
@@ -95,7 +95,8 @@ def main():
         print_license_and_exit()
 
     if "--version" in sys.argv:
-        print_version_and_exit()
+        print(src.facter.allocbench_version())
+        exit(0)
 
     parser = argparse.ArgumentParser(description="Summarize allocbench results in allocator sets")
     parser.add_argument("results", help="path to results", type=str)