<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -5,10 +5,9 @@
         easily from inside IDEA. A Git toolbar, full merging and refactoring support are also included. Git4Idea requires 
         an external Git command line tool to function.
     &lt;/description&gt;
-    &lt;change-notes&gt;Version 2.3 just fixes a few minor bugs and performance issues. Jumped to v2.3 to keep IDEA v7 and v8
-        plugin versions in sync. Git4Idea v8.1 and up is being maintained by JetBrains.
+    &lt;change-notes&gt;Version 2.4 fixes a few more minor bugs.
     &lt;/change-notes&gt;
-    &lt;version&gt;2.3&lt;/version&gt;
+    &lt;version&gt;2.4&lt;/version&gt;
     &lt;vendor url=&quot;http://github.com/markscott/git4idea/tree/master&quot; email=&quot;mscott@mqsoftware.com&quot;&gt;MQSoftware&lt;/vendor&gt;
     &lt;idea-version since-build=&quot;5000&quot; until-build=&quot;7999&quot;/&gt;
     &lt;application-components&gt;</diff>
      <filename>META-INF/plugin.xml</filename>
    </modified>
    <modified>
      <diff>@@ -336,6 +336,6 @@ public class GitVcs extends AbstractVcs implements Disposable {
      */
     public boolean fileExistsInVcs(FilePath path) {
         GitVirtualFile file = new GitVirtualFile(myProject, path.getPath());
-        return gitFileAdapter.isFileProcessable(file);
+        return gitFileAdapter.isGitControlled(file);
     }
 }
\ No newline at end of file</diff>
      <filename>src/git4idea/GitVcs.java</filename>
    </modified>
    <modified>
      <diff>@@ -18,6 +18,7 @@ package git4idea.actions;
  */
 import git4idea.GitUtil;
 import git4idea.GitVcs;
+import git4idea.vfs.GitVirtualFileAdapter;
 import git4idea.config.GitVcsSettings;
 import git4idea.commands.GitCommand;
 import com.intellij.openapi.project.Project;
@@ -32,7 +33,6 @@ import java.util.Map;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Arrays;
-import java.util.Collections;
 
 /**
  * Git &quot;add&quot; action
@@ -66,7 +66,7 @@ public class Add extends BasicAction {
             List&lt;VirtualFile&gt; list = roots.get(root);
             VirtualFile[] vfiles = list.toArray(new VirtualFile[list.size()]);
             command.add(vfiles);
-            vcs.getFileAdapter().ignoreFiles(vfiles, false);
+            vcs.getFileAdapter().gitControlFiles(vfiles, true);
         }
 
         VcsDirtyScopeManager mgr = VcsDirtyScopeManager.getInstance(project);
@@ -91,7 +91,7 @@ public class Add extends BasicAction {
             if(vfiles == null || vfiles.length == 0) continue;
             command.add(vfiles);
             GitVcs vcs = (GitVcs) VcsUtil.getVcsFor(project, vfiles[0]);
-            vcs.getFileAdapter().ignoreFiles(vfiles, false);
+            vcs.getFileAdapter().gitControlFiles(vfiles, true);
         }
 
         VcsDirtyScopeManager mgr = VcsDirtyScopeManager.getInstance(project);
@@ -109,9 +109,12 @@ public class Add extends BasicAction {
 
     @Override
     protected boolean isEnabled(@NotNull Project project, @NotNull GitVcs vcs, @NotNull VirtualFile... vFiles) {
-        for (VirtualFile file : vFiles)
-            return !vcs.getFileAdapter().isFileProcessable(file);
-        
+        GitVirtualFileAdapter gfa = vcs.getFileAdapter();
+        for (VirtualFile file : vFiles) {
+            if(gfa.fileIsIgnored(file))
+                return false;
+            return !gfa.isGitControlled(file);
+        }
         return true;
     }
 }
\ No newline at end of file</diff>
      <filename>src/git4idea/actions/Add.java</filename>
    </modified>
    <modified>
      <diff>@@ -16,23 +16,23 @@ package git4idea.actions;
  *
  * This code was originally derived from the MKS &amp; Mercurial IDEA VCS plugins
  */
+
 import com.intellij.openapi.fileChooser.FileChooser;
 import com.intellij.openapi.fileChooser.FileChooserDescriptor;
+import com.intellij.openapi.progress.ProgressManager;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.Messages;
 import com.intellij.openapi.vcs.AbstractVcs;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager;
 import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.openapi.progress.ProgressManager;
-import git4idea.GitUtil;
+import git4idea.GitVcs;
 import git4idea.commands.GitCommand;
 import git4idea.commands.GitCommandRunnable;
-import git4idea.GitVcs;
+import git4idea.vfs.GitVirtualFile;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.List;
-import java.util.Map;
 
 /**
  * Use Git to clone a repository
@@ -43,38 +43,33 @@ public class CloneRepo extends BasicAction {
                         @NotNull VirtualFile[] affectedFiles) throws VcsException {
         saveAll();
 
-        // TODO: implement remote repository login/password - setup remote repos in Git config,
-        // TODO: then just reference repo name here
-        final String src_repo = Messages.showInputDialog(project, &quot;Specify source repository URL&quot;, &quot;clone&quot;,
+        final String repoURL = Messages.showInputDialog(project, &quot;Specify repository clone URL&quot;, &quot;clone&quot;,
                 Messages.getQuestionIcon());
-        if (src_repo == null)
+        if (repoURL == null || (repoURL.length() == 0))
             return;
 
         FileChooserDescriptor fcd = new FileChooserDescriptor(false, true, false, false, false, false);
         fcd.setShowFileSystemRoots(true);
-        fcd.setTitle(&quot;Destination Directory&quot;);
-        fcd.setDescription(&quot;Select destination directory for clone.&quot;);
+        fcd.setTitle(&quot;Repository Parent Directory&quot;);
+        fcd.setDescription(&quot;Select parent directory for clone.&quot;);
         fcd.setHideIgnored(false);
         VirtualFile[] files = FileChooser.chooseFiles(project, fcd, null);
         if (files.length != 1 || files[0] == null) {
             return;
         }
 
-        final Map&lt;VirtualFile, List&lt;VirtualFile&gt;&gt; roots = GitUtil.sortFilesByVcsRoot(project, affectedFiles);
-        for (VirtualFile root : roots.keySet()) {
-            GitCommandRunnable cmdr = new GitCommandRunnable(project, vcs.getSettings(), root);
-            cmdr.setCommand(GitCommand.CLONE_CMD);
-            cmdr.setArgs(new String[]{src_repo, files[0].getPath()});
+        GitCommandRunnable cmdr = new GitCommandRunnable(project, vcs.getSettings(),
+                new GitVirtualFile(project, files[0].getPath()));
+        cmdr.setCommand(GitCommand.CLONE_CMD);
+        cmdr.setArgs(new String[]{repoURL});
 
-            ProgressManager manager = ProgressManager.getInstance();
-            //TODO: make this async so the git command output can be seen in the version control window as it happens...
-            manager.runProcessWithProgressSynchronously(cmdr, &quot;Cloning source repo &quot; + src_repo, false, project);
+        ProgressManager manager = ProgressManager.getInstance();
+        manager.runProcessWithProgressSynchronously(cmdr, &quot;Cloning repository &quot; + repoURL, false, project);
 
-            VcsException ex = cmdr.getException();
-            if (ex != null) {
-                Messages.showErrorDialog(project, ex.getMessage(), &quot;Error occurred during 'git clone'&quot;);
-                break;
-            }
+        VcsException ex = cmdr.getException();
+        if (ex != null) {
+            Messages.showErrorDialog(project, ex.getMessage(), &quot;Error occurred during 'git clone'&quot;);
+            return;
         }
 
         VcsDirtyScopeManager mgr = VcsDirtyScopeManager.getInstance(project);</diff>
      <filename>src/git4idea/actions/CloneRepo.java</filename>
    </modified>
    <modified>
      <diff>@@ -106,7 +106,7 @@ public class Delete extends BasicAction {
     protected boolean isEnabled(@NotNull Project project, @NotNull GitVcs vcs, @NotNull VirtualFile... vFiles) {
         GitVirtualFileAdapter fa = vcs.getFileAdapter();
         for (VirtualFile file : vFiles)
-            return fa.isFileProcessable(file);
+            return fa.isGitControlled(file);
 
         return true;
     }</diff>
      <filename>src/git4idea/actions/Delete.java</filename>
    </modified>
    <modified>
      <diff>@@ -49,37 +49,24 @@ public class Fetch extends BasicAction {
             }
         }
         for (VirtualFile root : roots) {
-            GitCommand command = new GitCommand(project, vcs.getSettings(), root);
-
             String initialValue = null;
-            List&lt;GitBranch&gt; rbranches = command.branchList(true);
-            if (rbranches != null &amp;&amp; rbranches.size() &gt; 0) {
-                initialValue = command.remoteRepoURL(rbranches.get(0));
-            }
-            String repoURL = Messages.showInputDialog(project,
-                    &quot;Enter remote repository name or URL to fetch (empty for default):&quot;,
-                    &quot;Fetch URL --&gt; &quot; + root.getPath(), Messages.getQuestionIcon(), initialValue, null);
+            String repo = Messages.showInputDialog(project,
+                    &quot;Enter repository &amp; refspec to fetch (empty for default/origin):&quot;,
+                    &quot;Fetch &lt;repository&gt; &lt;refspec&gt;... --&gt; &quot; + root.getPath(), Messages.getQuestionIcon(), initialValue, null);
 
             GitCommandRunnable cmdr = new GitCommandRunnable(project, vcs.getSettings(), root);
             cmdr.setCommand(GitCommand.FETCH_CMD);
-            cmdr.setArgs(new String[]{repoURL});
+            if(repo != null)
+                cmdr.setArgs(new String[]{repo});
 
             ProgressManager manager = ProgressManager.getInstance();
-            manager.runProcessWithProgressSynchronously(cmdr, &quot;Fetching from &quot; + repoURL, false, project);
+            manager.runProcessWithProgressSynchronously(cmdr, &quot;Fetching...&quot;, false, project);
 
             VcsException ex = cmdr.getException();
             if (ex != null) {
                 Messages.showErrorDialog(project, ex.getMessage(), &quot;Error occurred during 'git fetch'&quot;);
                 return;
             }
-
-            cmdr.setArgs(new String[] { &quot;--tags&quot;, repoURL });
-            manager.runProcessWithProgressSynchronously(cmdr, &quot;Updating tags from &quot; + repoURL, false, project);
-            ex = cmdr.getException();
-            if(ex != null)  {
-                Messages.showErrorDialog(project, ex.getMessage(), &quot;Error occurred during 'git fetch --tags'&quot;);
-                return;
-            }
         }
     }
 </diff>
      <filename>src/git4idea/actions/Fetch.java</filename>
    </modified>
    <modified>
      <diff>@@ -76,7 +76,7 @@ public class Merge extends BasicAction {
             
             GitCommandRunnable cmdr = new GitCommandRunnable(project, vcs.getSettings(), root);
             cmdr.setCommand(GitCommand.MERGE_CMD);
-            cmdr.setArgs(new String[] { &quot;--strategy=recursive&quot;, selectedBranch.getName() });
+            cmdr.setArgs(new String[] { selectedBranch.getName() });
 
             ProgressManager manager = ProgressManager.getInstance();
             manager.runProcessWithProgressSynchronously(cmdr, &quot;Merging branch &quot; + selectedBranch.getName(), false, project);</diff>
      <filename>src/git4idea/actions/Merge.java</filename>
    </modified>
    <modified>
      <diff>@@ -50,66 +50,25 @@ public class Pull extends BasicAction {
             }
         }
         for (VirtualFile root : roots) {
-            GitCommand command = new GitCommand(project, vcs.getSettings(), root);
-
             String initialValue = null;
-            List&lt;GitBranch&gt; rbranches = command.branchList(true);
-            if (rbranches != null &amp;&amp; rbranches.size() &gt; 0) {
-                initialValue = command.remoteRepoURL(rbranches.get(0));
-            }
-            String repoURL = Messages.showInputDialog(project,
-                    &quot;Enter remote repository name or URL to pull/merge (empty for default):&quot;,
-                    &quot;Pull URL --&gt; &quot; + root.getPath(), Messages.getQuestionIcon(), initialValue, null);
+            String repo = Messages.showInputDialog(project,
+                    &quot;Enter repository &amp; refspec to pull/merge (empty for default/origin):&quot;,
+                    &quot;Pull &lt;repository&gt; &lt;refspec&gt;... --&gt; &quot; + root.getPath(), Messages.getQuestionIcon(), initialValue, null);
 
             GitCommandRunnable cmdr = new GitCommandRunnable(project, vcs.getSettings(), root);
-            cmdr.setCommand(GitCommand.FETCH_CMD);
-            cmdr.setArgs(new String[] { repoURL });
+            cmdr.setCommand(GitCommand.PULL_CMD);
+            if(repo != null)
+                cmdr.setArgs(new String[] { repo });
 
             ProgressManager manager = ProgressManager.getInstance();
-            manager.runProcessWithProgressSynchronously(cmdr, &quot;Fetching from &quot; + repoURL, false, project);
+            manager.runProcessWithProgressSynchronously(cmdr, &quot;Pulling... &quot;, false, project);
 
             VcsException ex = cmdr.getException();
             if(ex != null)  {
-                Messages.showErrorDialog(project, ex.getMessage(), &quot;Error occurred during 'git fetch'&quot;);
-                return;
-            }
-
-            cmdr.setArgs(new String[] { &quot;--tags&quot;, repoURL });
-            manager.runProcessWithProgressSynchronously(cmdr, &quot;Updating tags from &quot; + repoURL, false, project);
-            ex = cmdr.getException();
-            if(ex != null)  {
-                Messages.showErrorDialog(project, ex.getMessage(), &quot;Error occurred during 'git fetch --tags'&quot;);
-                return;
-            }
-
-            List&lt;GitBranch&gt; branches = command.branchList();
-            String[] branchesList = new String[branches.size()];
-            GitBranch selectedBranch = null;
-            int i = 0;
-            for (GitBranch b : branches) {
-                 if (!b.isActive() &amp;&amp; selectedBranch == null)
-                    selectedBranch = b;
-                branchesList[i++] = b.getName();
-            }
-
-            if(selectedBranch == null)
-                selectedBranch = branches.get(0);
-
-            int branchNum = Messages.showChooseDialog(&quot;Select branch to merge into this one(&quot; + command.currentBranch() 
-                    + &quot;)&quot;, &quot;Merge Branch&quot;, branchesList, selectedBranch.getName(), Messages.getQuestionIcon());
-            if (branchNum &lt; 0) {
+                Messages.showErrorDialog(project, ex.getMessage(), &quot;Error occurred during 'git pull'&quot;);
                 return;
             }
-
-            selectedBranch = branches.get(branchNum);
-            cmdr.setCommand(GitCommand.MERGE_CMD);
-            cmdr.setArgs( new String[] { &quot;--strategy=recursive&quot;, selectedBranch.getName() });
-            manager.runProcessWithProgressSynchronously(cmdr, &quot;Merging branch &quot; + selectedBranch.getName(), false, project);
-            ex = cmdr.getException();
-            if(ex != null)  {
-                Messages.showErrorDialog(project, ex.getMessage(), &quot;Error occurred during 'git merge'&quot;);
-            }
-        }
+        }        
     }
 
     @Override</diff>
      <filename>src/git4idea/actions/Pull.java</filename>
    </modified>
    <modified>
      <diff>@@ -54,23 +54,20 @@ public class Push extends BasicAction {
             if (root == null) continue;
             String initialValue = null;
             String repo = Messages.showInputDialog(project,
-                    &quot;Enter repository to push to (empty for default/origin):&quot;,
-                    &quot;Push To Repo &lt;-- &quot; + root.getPath(), Messages.getQuestionIcon(), initialValue, null);
+                    &quot;Enter repository &amp; refspec to push to (empty for default/origin):&quot;,
+                    &quot;Push &lt;repository&gt; &lt;refspec&gt;... To Repo &lt;-- &quot; + root.getPath(), Messages.getQuestionIcon(), initialValue, null);
 
             GitCommandRunnable cmdr = new GitCommandRunnable(project, vcs.getSettings(), root);
             cmdr.setCommand(GitCommand.PUSH_CMD);
             if (repo != null)
-                cmdr.setArgs(new String[]{&quot;--mirror&quot;, repo});
-            else
-                cmdr.setArgs(new String[]{&quot;--mirror&quot;});
+                cmdr.setArgs(new String[]{ repo });
 
             ProgressManager manager = ProgressManager.getInstance();
-            manager.runProcessWithProgressSynchronously(cmdr, &quot;Pushing all commited changes, refs &amp; tags to remote repos&quot;,
-                    false, project);
+            manager.runProcessWithProgressSynchronously(cmdr, &quot;Pushing...&quot;, false, project);
 
             VcsException ex = cmdr.getException();
             if (ex != null) {
-                Messages.showErrorDialog(project, ex.getMessage(), &quot;Error occurred during 'git push --mirror'&quot;);
+                Messages.showErrorDialog(project, ex.getMessage(), &quot;Error occurred during 'git push'&quot;);
             }
         }
     }</diff>
      <filename>src/git4idea/actions/Push.java</filename>
    </modified>
    <modified>
      <diff>@@ -83,7 +83,7 @@ public class Revert extends BasicAction {
     @Override
     protected boolean isEnabled(@NotNull Project project, @NotNull GitVcs vcs, @NotNull VirtualFile... vFiles) {
         for (VirtualFile file : vFiles) {
-            if (!vcs.getFileAdapter().isFileProcessable(file)) return false;
+            if (!vcs.getFileAdapter().isGitControlled(file)) return false;
             FileStatus status = FileStatusManager.getInstance(project).getStatus(file);
             if (status == FileStatus.UNKNOWN || status == FileStatus.NOT_CHANGED)
                 return false;</diff>
      <filename>src/git4idea/actions/Revert.java</filename>
    </modified>
    <modified>
      <diff>@@ -62,7 +62,7 @@ public class RevisionGraph extends BasicAction {
     @Override
     protected boolean isEnabled(@NotNull Project project, @NotNull GitVcs vcs, @NotNull VirtualFile... vFiles) {
         for(VirtualFile file: vFiles)
-            return vcs.getFileAdapter().isFileProcessable(file);
+            return vcs.getFileAdapter().isGitControlled(file);
         
         return false;
     }</diff>
      <filename>src/git4idea/actions/RevisionGraph.java</filename>
    </modified>
    <modified>
      <diff>@@ -48,6 +48,7 @@ import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.StringReader;
+import java.io.FileInputStream;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -367,6 +368,40 @@ public class GitCommand {
     }
 
     /**
+     * If a Git commit template has been configured, return it's contents.
+     * @return  The commit template or null
+     */
+    public String getCommitTemplate() {
+        try {
+            String [] args = { &quot;commit.template&quot; };
+            String commitTemplateName = execute(CONFIG_CMD, null, args, true);
+            if (commitTemplateName == null || commitTemplateName.trim().length() == 0) return null;
+
+            File commitTemplateFile  = new File(commitTemplateName.trim());
+            if(!commitTemplateFile.exists()) return null;
+
+            byte[] contents = new byte[ (int) commitTemplateFile.length()];
+            FileInputStream fis = null;
+            try {
+                fis = new FileInputStream(commitTemplateFile);
+                fis.read(contents);
+                fis.close();
+                return new String(contents);
+            } catch (Exception e) {
+                return null;
+            } finally {
+                try {
+                    if (fis != null)
+                        fis.close();
+                } catch (IOException ie) {
+                }
+            }
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    /**
      * Builds the revision history for the specifid file.
      *
      * @param filePath The path to the file.
@@ -508,7 +543,7 @@ public class GitCommand {
             BufferedWriter out = null;
             try {
                 temp = File.createTempFile(&quot;git-commit-msg&quot;, &quot;.txt&quot;);
-                options = new String[]{&quot;-i&quot;, &quot;-F&quot;, temp.getAbsolutePath()};
+                options = new String[]{ &quot;-F&quot;, temp.getAbsolutePath()};
                 temp.deleteOnExit();
                 out = new BufferedWriter(new FileWriter(temp));
                 out.write(commitMessage.toString());</diff>
      <filename>src/git4idea/commands/GitCommand.java</filename>
    </modified>
    <modified>
      <diff>@@ -60,6 +60,8 @@ public class GitCheckinEnvironment implements CheckinEnvironment {
     private GitVcsSettings settings;
     private String tmpDir = System.getProperty(&quot;java.io.tmpdir&quot;);
     private File commitMsgFile = new File(tmpDir + File.separator + &quot;.git-commit-msg&quot;);
+    private static String DEF_COMMIT_MSG =
+            &quot;\n# Brief commit desciption here\n\n# Full commit description here (comment lines starting with '#' will not be included)\n\n&quot;;
 
     public GitCheckinEnvironment(@NotNull Project project, @NotNull GitVcsSettings settings) {
         this.project = project;
@@ -83,7 +85,13 @@ public class GitCheckinEnvironment implements CheckinEnvironment {
     @Override
     @Nullable
     public String getDefaultMessageFor(FilePath[] filesToCheckin) {
-        String defaultMsg = &quot;\n# Brief commit desciption here\n\n# Full commit description here (comment lines starting with '#' will not be included)\n\n&quot;;
+        if(filesToCheckin == null || filesToCheckin.length == 0) return null;
+        GitCommand command = new GitCommand(project, settings, GitUtil.getVcsRoot(project,filesToCheckin[0]));
+        String commitTemplate = command.getCommitTemplate();
+
+        if (commitTemplate != null)
+            return commitTemplate;
+
         if (commitMsgFile.exists() &amp;&amp; commitMsgFile.canRead()) {
             byte[] msgBytes = new byte[(int) commitMsgFile.length()];
             FileInputStream fis = null;
@@ -93,7 +101,7 @@ public class GitCheckinEnvironment implements CheckinEnvironment {
                 fis.close();
                 return new String(msgBytes);
             } catch (Exception e) {
-                return defaultMsg;
+                return DEF_COMMIT_MSG;
             } finally {
                 try {
                     if (fis != null)
@@ -103,7 +111,7 @@ public class GitCheckinEnvironment implements CheckinEnvironment {
                 }
             }
         } else {
-            return defaultMsg;
+            return DEF_COMMIT_MSG;
         }
     }
 </diff>
      <filename>src/git4idea/envs/GitCheckinEnvironment.java</filename>
    </modified>
    <modified>
      <diff>@@ -27,7 +27,9 @@ import git4idea.commands.GitCommand;
 import git4idea.config.GitVcsSettings;
 import git4idea.vfs.GitRevisionNumber;
 import git4idea.vfs.GitFileRevision;
+import git4idea.vfs.GitVirtualFileAdapter;
 import git4idea.GitUtil;
+import git4idea.GitVcs;
 import git4idea.providers.GitFileAnnotation;
 import org.jetbrains.annotations.NotNull;
 
@@ -57,6 +59,11 @@ public class GitAnnotationProvider implements AnnotationProvider {
             throw new VcsException(&quot;Cannot annotate a directory&quot;);
         }
 
+        // don't try to annotate non-Git files...
+        GitVcs vcs = (GitVcs)VcsUtil.getVcsFor(project, file);
+        GitVirtualFileAdapter gfa = vcs.getFileAdapter();
+        if(!gfa.isGitControlled(file)) return null;
+
         final FileAnnotation[] annotation = new FileAnnotation[1];
         final Exception[] exception = new Exception[1];
 
@@ -97,6 +104,6 @@ public class GitAnnotationProvider implements AnnotationProvider {
     }
 
     public boolean isAnnotationValid(VcsFileRevision rev) {
-        return (rev instanceof GitFileRevision);
+       return (rev instanceof GitFileRevision);
     }
 }</diff>
      <filename>src/git4idea/providers/GitAnnotationProvider.java</filename>
    </modified>
    <modified>
      <diff>@@ -52,7 +52,8 @@ public class GitVirtualFileAdapter extends VirtualFileAdapter implements LocalFi
     private static final String DEL_TITLE = &quot;Delete file&quot;;
     private static final String DEL_MESSAGE = &quot;Delete file(s) in Git?\n{0}&quot;;
     private Set&lt;String&gt; ignoreFiles = new HashSet&lt;String&gt;();
-    private Set&lt;String&gt; knownFiles = new HashSet&lt;String&gt;();
+    private Set&lt;String&gt; gitFiles = new HashSet&lt;String&gt;();
+    private Set&lt;String&gt; nonGitFiles = new HashSet&lt;String&gt;();
 
     public GitVirtualFileAdapter(@NotNull GitVcs vcs, @NotNull Project project) {
         this.vcs = vcs;
@@ -69,7 +70,7 @@ public class GitVirtualFileAdapter extends VirtualFileAdapter implements LocalFi
             return;
 
         final VirtualFile file = event.getFile();
-        if (!isFileProcessable(file))
+        if (!isGitControlled(file))
             return;
 
         VirtualFile vcsRoot = VcsUtil.getVcsRootFor(project, file);
@@ -113,10 +114,10 @@ public class GitVirtualFileAdapter extends VirtualFileAdapter implements LocalFi
         }
 
         if (filesToAdd == null || filesToAdd.size() == 0) {
-            ignoreFile(file, true);
+            gitControlFile(file, true);
             return;
         } else {
-            ignoreFile(file, false);
+            gitControlFile(file, false);
         }
 
         VirtualFile vcsRoot = VcsUtil.getVcsRootFor(project, file);
@@ -146,7 +147,7 @@ public class GitVirtualFileAdapter extends VirtualFileAdapter implements LocalFi
             return;
 
         final VirtualFile file = event.getFile();
-        if (!isFileProcessable(file))
+        if (!isGitControlled(file))
             return;
 
         List&lt;VirtualFile&gt; files = new ArrayList&lt;VirtualFile&gt;();
@@ -192,7 +193,7 @@ public class GitVirtualFileAdapter extends VirtualFileAdapter implements LocalFi
             return;
 
         final VirtualFile file = event.getFile();
-        if (!isFileProcessable(file))
+        if (!isGitControlled(file))
             return;
 
         VirtualFile vcsRoot = VcsUtil.getVcsRootFor(project, file);
@@ -270,29 +271,30 @@ public class GitVirtualFileAdapter extends VirtualFileAdapter implements LocalFi
 
 
     /**
-     * Specify whether or not Git should ignored the given files.
+     * Specify whether or not Git is controlling the given files.
      * @param files  The files to ignore/not-ignore
-     * @param ignoreMe  true if the files should be ignored, else false
+     * @param control  true if the files should be controlled by Git, else false
      */
-    public void ignoreFiles(@NotNull VirtualFile[] files, boolean ignoreMe) {
+    public void gitControlFiles(@NotNull VirtualFile[] files, boolean control) {
         if(files.length == 0) return;
         for (VirtualFile file : files) {
             if (file != null)
-                ignoreFile(file, ignoreMe);
+                gitControlFile(file, control);
         }
     }
 
     /**
-     * Specify whether or not Git should ignored the given file.
+     * Specify whether or not Git is controlling the given file.
      * @param file The file to ignore/not-ignore
-     * @param ignoreMe  true if the file should be ignored, else false
+     * @param control  true if the file is controlled by Git, else false
      */
-    public void ignoreFile(@NotNull VirtualFile file, boolean ignoreMe) {
-        if (ignoreMe)
-            ignoreFiles.add(file.getPath());
-        else {
+    public void gitControlFile(@NotNull VirtualFile file, boolean control) {
+        if (control) {
             ignoreFiles.remove(file.getPath());
-            knownFiles.add(file.getPath());
+            nonGitFiles.remove(file.getPath());
+            gitFiles.add(file.getPath());
+        } else {
+            ignoreFiles.add(file.getPath());
         }
     }
 
@@ -302,12 +304,13 @@ public class GitVirtualFileAdapter extends VirtualFileAdapter implements LocalFi
      * @param file The file to query
      * @return true if git is ignoring the file, else false
      */
-    public boolean ignoreFile(@NotNull VirtualFile file) {
+    public boolean fileIsIgnored(@NotNull VirtualFile file) {
+        isGitControlled(file);
         return ignoreFiles.contains(file.getPath());
     }
 
     /** Returns the current list of ignored files for this project. */
-    public Set&lt;String&gt; getIgnoreFiles() {
+    public Set&lt;String&gt; getIgnoredFiles() {
         return ignoreFiles;
     }
 
@@ -321,8 +324,9 @@ public class GitVirtualFileAdapter extends VirtualFileAdapter implements LocalFi
      * @param file The file to check.
      * @return Returns true of the file can be added.
      */
-    public boolean isFileProcessable(@NotNull VirtualFile file) {
-        if (knownFiles.contains(file.getPath())) return true;
+    public boolean isGitControlled(@NotNull VirtualFile file) {
+        if (gitFiles.contains(file.getPath())) return true;
+        if (nonGitFiles.contains(file.getPath())) return false;
         if (ignoreFiles.contains(file.getPath())) return false;
 
         if (file.isDirectory() &amp;&amp; file.getName().equals(&quot;.git&quot;)) {
@@ -336,17 +340,17 @@ public class GitVirtualFileAdapter extends VirtualFileAdapter implements LocalFi
 
         VirtualFile vcsRoot = VcsUtil.getVcsRootFor(project, file);
         if(vcsRoot == null) {
-            ignoreFiles.add(file.getPath());
+            nonGitFiles.add(file.getPath());
             return false;
         }
 
         GitCommand command = new GitCommand(project, vcs.getSettings(), vcsRoot);
         try {
             if(command.status(file)) {
-                knownFiles.add(file.getPath());
+                gitFiles.add(file.getPath());
                 return true;
             } else {
-                ignoreFiles.add(file.getPath());
+                nonGitFiles.add(file.getPath());
                 return false;
             }
         } catch (VcsException e) {</diff>
      <filename>src/git4idea/vfs/GitVirtualFileAdapter.java</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>3ddb7eac04d4a8f83b7536a8eb4022a2f70441ee</id>
    </parent>
  </parents>
  <author>
    <name>Mark Scott</name>
    <email>mscott@mqsoftware.com</email>
  </author>
  <url>http://github.com/markscott/git4idea/commit/d879680b19875b145fed7fabf93c23960437f261</url>
  <id>d879680b19875b145fed7fabf93c23960437f261</id>
  <committed-date>2009-05-01T15:12:08-07:00</committed-date>
  <authored-date>2009-05-01T15:12:08-07:00</authored-date>
  <message>Fixed several bugs related to push/pull/fetch/merge &amp; other operations</message>
  <tree>c35abc4a081eb0a3a3f33d829331f0d4ce0bad12</tree>
  <committer>
    <name>Mark Scott</name>
    <email>mscott@mqsoftware.com</email>
  </committer>
</commit>
