如何避免在git-add时指定绝对文件路径

时间:2011-06-06 07:26:11

标签: git git-add

一旦文件路径变得冗长,使用git add命令就会变得乏味。对于例如 git add src_test/com/abc/product/server/datasource/manager/aats/DSManger.java
是否可以绕过指定绝对文件路径?可能会使用某种模式或什么?

我知道我们可以使用git gui。但是我想用cmd线来做。

提前感谢您的投入。

6 个答案:

答案 0 :(得分:49)

对于类似unix的系统,您始终可以使用星号指向文件,例如

 git add *DSManager.java

将包含git可以在您当前工作目录中的源代码树中找到的所有DSManager.java文件。

答案 1 :(得分:35)

这是添加文件的另一种方法。至少在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

2选择更新,或键入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

按与您要暂存的文件对应的数字。用逗号分隔多个数字,例如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>>

在这里按[enter]

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.

最后输入7q退出。

答案 2 :(得分:32)

使用bash,您可以设置“globstar”(shopt -s globstar),然后执行:

git add **/DSManger.java

添加当前目录下的所有名为DSManager.java的文件。

**/匹配所有目录和子目录。)

答案 3 :(得分:3)

我不确定我是否理解你的问题。

要添加所有文件(尚未添加),请使用:

git add .

如果您需要添加除一个文件以外的所有文件,请冷添加所有文件,然后使用以下命令删除文件:

git reset HEAD <file>

您还可以使用

添加子目录中的所有文件
git add subdir/

我知道的一件事令人讨厌的是当你重命名文件时,你需要添加新的文件名和git rm旧名称。重命名目录时,这可能很烦人。这个(仅限unix)git别名解决了这个问题(把它放在〜/ .gitconfig文件中:

[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

这将添加所有新文件并删除所有已删除的文件并将其转发到索引。

答案 4 :(得分:1)

我相信如果你的终端窗口当前正在进入正确的文件夹(src_test / com / abc / product / server / datasource / manager / aats),你可以说“git add DSManger.java”。所以就这样做:

cd src_test/com/abc/product/server/datasource/manager/aats
git add DSManger.java

否则,除非你单独制作回购,否则我不会想到任何其他方式。

答案 5 :(得分:0)

请查看我为此目的创建的此示例bash脚本。 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.
'

示例输出

$ ./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