anchor.diff:      }
       actionManager.registerAction(new GitResolveConflictsAction(this));
       actionManager.registerAction(new GitCommitAction(this, getDialogElement("#gitCommitDialog")));
  +    actionManager.registerAction(new GitAddAction(this));
       actionManager.registerAction(new GitRevertChangesAction(this));
       actionManager.registerAction(new GitPushAction(this, getDialogElement("#gitPushDialog")));
       actionManager.registerAction(new RunTestsAction(this));
  
positive.code:       spark.showSuccessMessage('Pull successful');
      }).catchError((e) {
        spark.showErrorMessage('Git Pull Status', e.toString());
      });
    }
  }
  
negative.code:   bool appliesTo(context) => _isScmProject(context);
  }
  
  class GitAddAction extends SparkAction implements ContextAction {
    GitAddAction(Spark spark) : super(spark, "git-add", "Add file to git");
    chrome.Entry entry;
  
    void _invoke([List<ws.Resource> resources]) {
      ScmProjectOperations operations =
          spark.scmManager.getScmOperationsFor(resources.first.project);
      List<chrome.Entry> files = [];
      resources.forEach((resource) {
        files.add(resource.entry);
      });
      spark.jobManager.schedule(new _GitAddJob(operations, files, spark));
    }
  
    String get category => 'git';
  
    bool appliesTo(Object object) => _isFileList(object);
  }
  
  class GitBranchAction extends SparkActionWithDialog implements ContextAction {
    ws.Project project;
    GitScmProjectOperations gitOperations;
  