问题
Using git add
command becomes tedious once the file path becomes lengthy. For e.g.
git add src_test/com/abc/product/server/datasource/manager/aats/DSManger.java
Is it possible to bypass specifying absolute file path? May be using some kind of pattern or something?
I know that we can use git gui
. But I want to do it using cmd line.
Thanks in advance for the inputs.
回答1:
For unix-like systems you can always use the star to point to files, e.g.
git add *DSManager.java
will include all DSManager.java files git can find within your source tree starting in your current working directory.
回答2:
Here is another way to add files. Supported at the very least in git 1.7.1.
$ git add -i
staged unstaged path
1: unchanged +61/-61 a/very/long/path/that/we/really/dont/want/to/type.txt
2: unchanged +1/-1 another/very/long/path/that/we/really/dont/want/to/type.txt
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now> 2
Press 2
to select update, or type u
.
staged unstaged path
1: unchanged +61/-61 a/very/long/path/that/we/really/dont/want/to/type.txt
2: unchanged +1/-1 another/very/long/path/that/we/really/dont/want/to/type.txt
Update>> 2
Press the number corresponding to the file you want to stage. Separate multiple numbers with a comma, e.g. 1,2
.
staged unstaged path
1: unchanged +61/-61 a/very/long/path/that/we/really/dont/want/to/type.txt
* 2: unchanged +1/-1 another/very/long/path/that/we/really/dont/want/to/type.txt
Update>>
Just press [enter]
here.
updated one path
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now> q
Bye.
Finally type 7
or q
to quit.
回答3:
With bash, you can set "globstar" (shopt -s globstar
) and then do:
git add **/DSManger.java
to add all files called DSManager.java present below the current directory.
(**/
matches all directories and subdirectories.)
回答4:
I'm not sure if I understand your question.
To add all files (not yet added), use:
git add .
If you need to add all but one file, you cold add all, then remove the files using:
git reset HEAD <file>
You can also add all files in a subdirectory with
git add subdir/
One thing that I know can be annoying is when you rename files, you need to add the new filename and git rm the old name. When renaming a directory this can be annoying. This (unix only) git alias solves this problem (put it in your ~/.gitconfig file:
[alias] ;add after this heading or create this heading if it does not exist
addremove = !git add . && git ls-files --deleted | xargs --no-run-if-empty git rm
This adds all new files and removes all deleted files and stages it to the index.
回答5:
I believe you can just say "git add DSManger.java" if your terminal window is currently cd into the proper folder (src_test/com/abc/product/server/datasource/manager/aats). So just do:
cd src_test/com/abc/product/server/datasource/manager/aats
git add DSManger.java
Otherwise, I can't think of any other way unless you make a separate repo.
回答6:
Please have a look at this sample bash script which I have created for this purpose. Link to the Github Repo
#!/bin/bash
# Script Name: git-bash.sh
#
# Author: Krishnadas P.C<pckrishnadas88@gmail.com>
# Date : 05-05-2018
#
# Description: A simple script to manipulate git files.
# TODO add more options and add Error Handlers.
#declare color variables
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
#print the current git branch
echo "On Branch - $(git branch)"
#Get only staged files
gitstaged=($(git diff --name-only --cached))
#Get changes not staged for commit
gitnotstaged=($(git diff --name-only))
#Get only untracked files
gituntracked=($(git ls-files --others --exclude-standard))
if [ $# -ge 3 ];
then
if [ $2 == "st" ];
then
git $1 ${gitstaged[$3]}
elif [ $2 == "nt" ];
then
git $1 ${gitnotstaged[$3]}
elif [ $2 == "ut" ];
then
git $1 ${gituntracked[$3]}
else
echo "Invalid input provied."
fi
fi
#Get the new status after the command has been executed.
gitstaged=($(git diff --name-only --cached))
#Get changes not staged for commit
gitnotstaged=($(git diff --name-only))
#Get only untracked files
gituntracked=($(git ls-files --others --exclude-standard))
#print the staged files.
for i in ${!gitstaged[@]}; do
if [ $i -eq 0 ]; then
echo "Changes to be committed:"
fi
echo "${green}st$i - ${gitstaged[$i]}${reset}"
done
#print the changes not staged files.
for i in ${!gitnotstaged[@]}; do
if [ $i -eq 0 ]; then
echo "Changes not staged for commit:"
fi
echo "${red}nt$i - ${gitnotstaged[$i]}${reset}"
done
#print the untracked files.
for i in ${!gituntracked[@]}; do
if [ $i -eq 0 ]; then
echo "Untracked files:"
fi
echo "${red}ut$i - ${gituntracked[$i]}${reset}"
done
: 'Example how to:
#$ ./git-bash.sh
Untracked files
ut0 - git-bash.sh
ut1 - git-status.txt
ut2 - test
$./git-bash.sh add ut 0
Staged files
st0 - git-bash.sh
st1 - git-status.txt
Untracked files
ut0 - test
ut stands for untracked files.
nt stands for notstaged tracked files.
st stands for staged files.
'
Sample output
$ ./git-bash.sh
On Branch - * master
Untracked files:
ut0 - git-bash.sh
ut1 - git-status.txt
ut2 - test
$ ./git-bash.sh add ut 2
On Branch - * master
Changes to be committed:
st0 - test
Untracked files:
ut0 - git-bash.sh
ut1 - git-status.txt
来源:https://stackoverflow.com/questions/6248917/how-to-avoid-specifying-absolute-file-path-while-git-add