8

This has caught me up a couple times. I have a terminal open inside a GIT repository. I do git status to see all the changes across the repository. I then do git add -A, git commit -m "Some text" and git push to push everything to GitHub.

But... I fail to realise that my terminal's working directory is not the repository's root directory, so actually, git add -A does not commit all changes git status told me about, only the changes to files inside the terminal's working directory.

How can I git add from within a GIT repository (not necessarily having the root directory as working directory) so that it will add all changes across the repository?

1
  • BTW, beginning with Git 2.0, git add -A and git add -u will start operating on the entire tree for consistency with other commands. So say the Git 1.8.2 release notes.
    – jjlin
    Mar 14, 2013 at 5:31

3 Answers 3

19

You can use git add -A :/.

A pathspec which starts with a colon tells git that it should interpret the remainder of that pathspec from the base of the repository rather than from the current directory. Followed by just a slash it will refer to the root of the repository, causing git add to add all changes.

This appears to require git 1.7.6 or newer.

7
  • Didn't work: fatal: pathspec 'server/:' did not match any files
    – Randomblue
    Feb 12, 2013 at 15:08
  • What OS are you using? Windows perhaps? It sounds like the colon is being handled by something other than git. That command works on Linux. There may be a way to quote the argument on your OS.
    – qqx
    Feb 12, 2013 at 15:10
  • I'm using RedHat Enterprise Linux 6.
    – Randomblue
    Feb 12, 2013 at 15:35
  • I take back the bit about it being some OS issue. I'am able to get that same type of error message by adding some random characters after the colon. Does it work if you use :. (colon followed by dot) in place of the lone :?
    – qqx
    Feb 12, 2013 at 15:42
  • As I've noted in an edit of the answer, this appears to require version 1.7.6 of git. I believe that RHEL6 ships with 1.7.1, so it wouldn't support this syntax.
    – qqx
    Feb 12, 2013 at 16:10
4

Since my other answer requires a newer version of git, here's an alternative that will hopefully work with older versions.

Aliases where the expansion starts with an exclamation mark are treated as separate shell commands, and they are defined as executing in the top level of the repository. So you could define such an alias and use that in place of git add:

git config --global alias.addroot '!git add'
git addroot -A

Or you could include the -A option in the alias.

2

git commit -a -m commit_msg will do what you want. Note that with this command, the -a flag does the adding, so don't do a separate git add before the commit.

3
  • commit -a won't add new files to the repository, only all changes to already tracked files. It also won't remove files from the repository which have been removed from the working tree like add -A will do.
    – qqx
    Feb 12, 2013 at 14:58
  • One difference to be aware of here is that git add -A will add untracked files, whereas git commit -a only adds changed files. Also git add -A will remove missing files from the index. Feb 12, 2013 at 14:59
  • @qqx, you can do a git add ...., the git commit -am "My message" will pick them up.
    – vonbrand
    Feb 13, 2013 at 3:41

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .