Как избежать указания абсолютного пути к файлу при git-add - PullRequest
52 голосов
/ 06 июня 2011

Использование команды git add становится утомительным, когда путь к файлу становится длинным. Например, git add src_test/com/abc/product/server/datasource/manager/aats/DSManger.java
Можно ли обойтись без указания абсолютного пути к файлу? Может быть, использовать какой-то шаблон или что-то?

Я знаю, что мы можем использовать git gui. Но я хочу сделать это с помощью строки cmd.

Заранее спасибо за входные данные.

Ответы [ 6 ]

49 голосов
/ 06 июня 2011

Для Unix-подобных систем вы всегда можете использовать звездочку для указания файлов, например,

 git add *DSManager.java

будет включать все файлы DSManager.java, которые git может найти в вашем исходном дереве, начиная с текущего рабочего каталога.

35 голосов
/ 10 апреля 2013

Вот еще один способ добавления файлов. Поддерживается как минимум в 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.

Наконец, наберите 7 или q для выхода.

32 голосов
/ 06 июня 2011

С помощью bash вы можете установить «globstar» (shopt -s globstar) и затем:

git add **/DSManger.java

, чтобы добавить все файлы с именем DSManager.java, расположенные ниже текущего каталога.(**/ соответствует всем каталогам и подкаталогам.)

3 голосов
/ 06 июня 2011

Я не уверен, что понимаю ваш вопрос.

Чтобы добавить все файлы (еще не добавленные), используйте:

git add .

Если вам нужно добавить все файлы, кроме одного, вы все добавляете, а затем удаляете файлы, используя:

git reset HEAD <file>

Вы также можете добавить все файлы в подкаталог с помощью

git add subdir/

Одна вещь, которую я знаю, может раздражать, когда вы переименовываете файлы, вам нужно добавить новое имя файла и git rm старое имя. При переименовании каталога это может раздражать. Этот псевдоним git (только для Unix) решает эту проблему (поместите его в файл ~ / .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

При этом все новые файлы добавляются, удаляются все удаленные файлы и помещаются в индекс.

1 голос
/ 06 июня 2011

Полагаю, вы можете просто сказать «git add DSManger.java», если ваше окно терминала в настоящий момент находится в соответствующей папке (src_test / com / abc / product / server / datasource / manager / aats)Так что просто сделайте:

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

В противном случае, я не могу думать ни о каком другом пути, если вы не сделаете отдельный репо.

0 голосов
/ 06 мая 2018

Пожалуйста, посмотрите на этот пример скрипта bash, который я создал для этой цели. Ссылка на 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
...