11

I have configured IntelliJ as my diff and mergetool on my mac, but the git launches it, the command line always returns immediately, rather than waiting for the diff to be completed, which means that the changes enacted are not reflected on disk.

My configuration is:

[mergetool "intellij"]
    cmd = /Applications/IntelliJ\\ IDEA\\ 13\\ CE.app/Contents/MacOS/idea merge \
          $(cd $(dirname \"$LOCAL\") && pwd)/$(basename \"$LOCAL\") \
          $(cd $(dirname \"$REMOTE\") && pwd)/$(basename \"$REMOTE\") \
          $(cd $(dirname \"$BASE\") && pwd)/$(basename \"$BASE\") 
          $(cd $(dirname \"$MERGED\") && pwd)/$(basename \"$MERGED\")
    trustExitCode = true

I've testing calling IntelliJ by hand without git and it also returns immediately, so I don't think this is caused by git's invocation, rather that the IntelliJ command line invocation just sends a message to open the window to an existing running instance of IntelliJ.. Is there an option to force IntelliJ to not return or spawn a new instance to make this work?

Arne Claassen
  • 14,088
  • 5
  • 67
  • 106

3 Answers3

4

This works now.

Run the action "Create Command-line launcher..." to create the launch script (for me /usr/local/bin/idea.)

In .gitconfig:

[mergetool "idea"]
  cmd = idea merge \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\"
  trustExitCode = true

likewise for difftool

[difftool "idea"]
  cmd = idea diff \"$LOCAL\" \"$REMOTE\"

(Because of a bug, you may have to update the commandline launcher if you created it a while ago and have updated Intellij in the meantime.)

Joshua Goldberg
  • 5,059
  • 2
  • 34
  • 39
3

There is no way to do it. There are three workarounds:

  1. Close existing application before using difftool. If there are no other windows open, mergetool will work correctly.

  2. Use second instance of IntelliJ with different caches and config home But be careful with licensing of second instance. If you use license server for example both instances will take a license from server.

  3. Add something like pause (on Windows) to a startup script. So git will call BAT file (on Windows) and this BAT file will call IntelliJ and then wait for input. After you do all what you need, you should go back to console and press any key manually.

Matthew Simoneau
  • 6,199
  • 6
  • 35
  • 46
Yavanosta
  • 1,480
  • 3
  • 18
  • 27
0

As Joshua Goldberg mentioned for idea, the same works for Rubymine.

Open RubyMine, then to shift + command + A, choose "Create Command-line launcher" and save. After that you can use "mine" command in terminal without issues and you should update the git config file.

[difftool "mine"]
  cmd = mine diff \"$LOCAL\" \"$REMOTE\"
[mergetool "mine"]
  cmd = mine merge \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\"
  trustExitCode = true

Thank you very much Joshua, great help!