【问题标题】:How to avoid specifying absolute file path while git-add如何避免在 git-add 时指定绝对文件路径
【发布时间】:2011-09-09 02:04:45
【问题描述】:

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

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

提前感谢您的意见。

【问题讨论】:

    标签: git git-add


    【解决方案1】:

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

     git add *DSManager.java
    

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

    【讨论】:

    • 显然,这只会添加新创建的文件,但会跳过修改过的文件。有什么理由吗?
    • 对我来说,这也适用于修改后的文件。也许这取决于 git 版本、bash 版本、操作系统。我不知道。我在 OSX 10.6 上使用 git 1.7.5.4 和 bash 4.2.10(2)。
    • 恐怕这不会在Linux version 2.6.32 gcc version 4.4.7 Red Hat 4.4.7-17(Godaddy Linux Hosting)上添加修改过的文件,只会添加新文件; git 版本 1.7.1
    【解决方案2】:

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

    【讨论】:

    • 这是正确答案。它不像 globbing 那样依赖于 shell。此外,当文件名可能非常相似时,很难编写一个好的 glob 模式来仅匹配您想要添加的内容。
    • 这对我帮助很大;我的 git 版本是共享主机帐户上的 1.7.1。
    • 提个醒,这有帮助
    • 也认为这应该是公认的答案,对我很有用。
    • 这篇文章让我很开心 :)
    【解决方案3】:

    使用 bash,您可以设置 "globstar" (shopt -s globstar),然后执行以下操作:

    git add **/DSManger.java
    

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

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

    【讨论】:

    • 这实际上是更好的解决方案,因为它只包含名为 DSManager.java 的文件,而忽略了名为 OtherDSManager.java 的文件。但是,您的 shell 必须支持 globstar 选项。
    【解决方案4】:

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

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

    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
    

    这会添加所有新文件并删除所有已删除文件并将其暂存到索引中。

    【讨论】:

    • 并不难。重命名 dir 然后 git add -A
    【解决方案5】:

    如果您的终端窗口当前 cd 到正确的文件夹 (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
    

    要不然我想不出别的办法了,除非你做一个单独的repo。

    【讨论】:

    • 对。那应该行得通。但是要提交的文件来自不同的包,因此每次cd 都会再次乏味
    【解决方案6】:

    请查看我为此目的创建的这个示例 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 2012-07-17
      • 2014-06-27
      相关资源
      最近更新 更多