public CommitInfo(SnapshotInfo info, string message)
 {
     Date = DateTime.Now;
     Previos = info.Previos;
     Message = message;
     Files = info.Files;
     Id = info.Id;
 }
 //делает коммит используя инфу из снепшота
 public static CommitInfo Commit(SnapshotInfo snapshot, DirectoryInfo workspace, string message)
 {
     string snapshotsDir = Path.Combine(workspace.FullName, Global.SnapshotsDirPath);
     string snapshotDir = Path.Combine(snapshotsDir, snapshot.Id);
     Directory.CreateDirectory(snapshotDir);
     CopyAllExceptRepository(workspace.FullName, snapshotDir);
     var commit = new CommitInfo(snapshot, message);
     WriteCommit(workspace, commit);
     return commit;
 }
        //метод который знает рабочую папку,предыдущий снепшот и вычисляет изменение
        public static SnapshotInfo CreateSnapshot(DirectoryInfo workspace, SnapshotInfo previos)
        {
            Environment.CurrentDirectory = workspace.FullName;

            var snapshot = new SnapshotInfo();

            if (previos == null)
            {
                snapshot.Files = new List<TrackedFileInfo>();

                foreach (string file in FileFinder.GetAllFiles(workspace))
                    snapshot.Files.Add(new TrackedFileInfo(file) {Status = FileStatus.New});

                snapshot.Id = Global.MasterCommitName;
            }
            else
            {
                var previosDictionary = new Dictionary<string, KeyValuePair<byte[], FileStatus>>(); // previos
                var currentDictionary = new Dictionary<string, KeyValuePair<byte[], FileStatus>>(); // current
                var hashes = new List<byte[]>();

                snapshot.Files = new List<TrackedFileInfo>();

                foreach (string file in FileFinder.GetAllFiles(workspace))
                    snapshot.Files.Add(new TrackedFileInfo(file));

                foreach (TrackedFileInfo f in previos.Files)
                    previosDictionary.Add(f.Name, new KeyValuePair<byte[], FileStatus>(f.Hash, f.Status));
                foreach (TrackedFileInfo f in snapshot.Files)
                    currentDictionary.Add(f.Name, new KeyValuePair<byte[], FileStatus>(f.Hash, f.Status));

                snapshot.Files = WorkspaceDiff(previosDictionary, currentDictionary);//сравнивает 2 словаря возвращает разницу

                foreach (TrackedFileInfo f in snapshot.Files)
                    hashes.Add(f.Hash);//формируем список хешей всех файлов

                snapshot.Previos = previos.Id;
                snapshot.Id = BitConverter.ToString(Hasher.MergeHashes(hashes)).Replace("-", "");
            }
            return snapshot;
        }