web-dev-qa-db-ja.com

git-add中に絶対ファイルパスを指定しないようにする方法

ファイルパスが長くなると、git addコマンドの使用は面倒になります。たとえばgit add src_test/com/abc/product/server/datasource/manager/aats/DSManger.Java
絶対ファイルパスの指定をバイパスすることは可能ですか?なんらかのパターンを使用しているのでしょうか?

git guiを使用できることはわかっています。しかし、私はcmd行を使用してそれをしたいです。

入力を事前に感謝します。

55
Vaman Kulkarni

UNIXライクなシステムでは、常にスターを使用してファイルを指すことができます。

 git add *DSManager.Java

gitがソースツリー内で現在の作業ディレクトリから検索できるすべてのDSManager.Javaファイルが含まれます。

49
Steffen

ファイルを追加する別の方法を次に示します。少なくとも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と入力して終了します。

35
enzipher

Bashを使用すると、 "globstar"(shopt -s globstar)その後、次のようにします。

git add **/DSManger.Java

現在のディレクトリの下にあるDSManager.Javaというファイルをすべて追加します。

**/はすべてのディレクトリとサブディレクトリに一致します。)

33
dogbane

あなたの質問が理解できるかどうかわかりません。

すべてのファイル(まだ追加されていない)を追加するには、次を使用します。

git add .

1つを除いてすべてを追加する必要がある場合は、すべてをコールド追加してから、次のコマンドを使用してファイルを削除します。

git reset HEAD <file>

サブディレクトリ内のすべてのファイルを追加することもできます

git add subdir/

面倒なことがわかっていることの1つは、ファイルの名前を変更するときに、新しいファイル名と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

これにより、すべての新しいファイルが追加され、削除されたすべてのファイルが削除されて、インデックスにステージングされます。

3

端末ウィンドウが現在適切なフォルダー(src_test/com/abc/product/server/datasource/manager/aats)にcdされている場合は、「git add DSManger.Java」とだけ言うことができると思います。だからちょうどしてください:

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

そうでなければ、別のリポジトリを作成しない限り、他の方法を考えることはできません。

1
Jon

この目的のために作成したサンプルのbashスクリプトをご覧ください。 Githubリポジトリへのリンク

#!/bin/bash
# Script Name: git-bash.sh
#
# Author: Krishnadas P.C<[email protected]>
# 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
0
Krishnadas PC