Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's a <pathspec> in the git command?

Tags:

I have updated, modified and removed files in my application and I am now ready to commit. Here is the status:

C:\G\ab\WebAdminApp>git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   WebAdminApp.csproj
        modified:   WebAdminApp.csproj.user
        modified:   app/admin/controllers/ContentController.ts
        deleted:    app/admin/interfaces/IEnumService.ts
        modified:   app/admin/interfaces/IHomeController.d.ts
        modified:   lib/pagedown/Markdown.Sanitizer.ts
        deleted:    lib/typings/global.ts
        modified:   package.json
        modified:   ../abilitest-admin.v12.suo

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        app/interfaces/IEnumService.d.ts
        app/interfaces/IUtilityService.d.ts
        ../npm-debug.log

no changes added to commit (use "git add" and/or "git commit -a")

When I enter:

git add . 

It gives me a message saying:

C:\G\ab\WebAdminApp>git add .
warning: You ran 'git add' with neither '-A (--all)' or '--ignore-removal',
whose behaviour will change in Git 2.0 with respect to paths you removed.
Paths like 'WebAdminApp/app/admin/interfaces/IEnumService.ts' that are
removed from your working tree are ignored with this version of Git.

* 'git add --ignore-removal <pathspec>', which is the current default,
  ignores paths you removed from your working tree.

* 'git add --all <pathspec>' will let you also record the removals.

I would like everything I did on my local PC to be committed and then I want the master on GITHUB to reflect this.

Can someone explain what does it mean and what should I now enter so all the changes can be committed with a git commit ? Sorry it's not clear to me. Is the directory or ?

like image 729
Samantha J T Star Avatar asked Dec 30 '14 20:12

Samantha J T Star


2 Answers

This answer was entirely derived from Git Pathspecs and How to Use Them. I haven't copied everything over, so look into the link to dig deeper


The pathspec is the mechanism that git uses for limiting the scope of a git command to a subset of the repository. If you have used much git, you have likely used a pathspec whether you know it or not. For example, in the command git add README.md, the pathspec is README.md. However, it is capable of much more nuance and flexibility.

So, why should you learn about pathspecs? Since it is a part of many commands, these commands become much more powerful with an understanding of pathspecs. With git add, you can add just the files within a single directory. With git diff, you can examine just the changes made to filenames with an extension of .scss. You can git grep all files except for those in the /dist directory.

File or directory

git add .      # add CWD (current working directory)
git add ..     # add parent directory and its subdirectories
git add src/   # add src/ directory
git add README # add only README directory

Also note that the git add command takes [<pathspec>...]. The ... means possibility of multiple occurence. So you can do:

git add /content /images

and that would all changes under both directories.

if you ever do ls -a, it will list all files and 'directory entries', it will include . and .. for more see here

Wildcards

git log '*.js' # logs all .js files in CWD and subdirectories
git log '.*'   # logs all 'hidden' files and directories in CWD
git log '*/.*' # logs all 'hidden' files and directories in subdirectories

top

The top signature tells git to match the pattern from the root of the git repository rather than the current working directory. You can also use the shorthand :/ rather than :(top).

git ls-files ':(top)*.js'
git ls-files ':/*.js' # shorthand

icase

The icase signature tells git to not care about case when matching e.g. this could be useful for matching jpg files, which sometimes use the uppercase extension JPG.

git ls-files ':(icase)*.jpg'

exclude

Lastly, there is the “exclude'” magic signature (shorthand of :! or :^). e.g. you can search through all of your .js files while excluding the .spec.js test files.

git grep 'foo' -- '*.js' ':(exclude)*.spec.js' # search .js files excluding .spec.js
git grep 'foo' -- '*.js' ':!*.spec.js' .       # shorthand for the same
like image 56
mfaani Avatar answered Oct 14 '22 19:10

mfaani


From the Git Glossary:

[A pathspec is a pattern] used to limit paths in Git commands.

Pathspecs are used on the command line of "git ls-files", "git ls-tree", "git add", "git grep", "git diff", "git checkout", and many other commands to limit the scope of operations to some subset of the tree or worktree.

As an example, the command git add :/**.ts will recursively add to the index all of the files that end with .ts starting at the root of the repository (respecting the various ways of ignoring files).

like image 34
chwarr Avatar answered Oct 14 '22 21:10

chwarr