
3つのフォルダを含む/ c / Toolsフォルダがあります。
以下のコマンドが欲しい
$ ls --show-repositories
Toolsはgitリポジトリではありませんが、Tools / MyProjectとTools / MyAppはgitリポジトリです。私が望む出力は次のとおりです。
drwxr-xr-x 1 0018121 Domain Users 0 Dec 14 14:33 MyProject/ (develop)
drwxr-xr-x 1 0018121 Domain Users 0 Dec 14 14:17 Data/
drwxr-xr-x 1 0018121 Domain Users 0 Dec 14 12:08 MyApp/ (master)
-rw-r--r-- 1 0018121 Domain Users 399K Aug 4 10:41 readme.txt
-rw-r--r-- 1 0018121 Domain Users 136K Aug 4 10:20 image.jpg
これにより、親フォルダからサブフォルダが現在有効なGitリポジトリ(および現在チェックアウトされている分岐)であることがわかります。
ありがとう
答え1
簡単にしてください。そのディレクトリを見つけて、含まれている.git
ディレクトリからコマンドを実行します。また、aと入力して-print
実行中のディレクトリを確認することもできます。
find . -type d -name .git -print -execdir git symbolic-ref --short HEAD \;
(まあ、実際に-print
ディレクトリを表示します。確立された- ./path/to/repo/.git
、それ自体ではなく./path/to/repo/
。しかし、これはマイナーな不便です。 )
編集:以下を使用すると、OPから要求された正確な出力を生成できます。
paste <(ls -ld *) <(for i in *; do if [ -d "$i"/.git ] ; then echo "($(git --git-dir="$i"/.git symbolic-ref --short HEAD))"; else echo; fi; done)
私はこれについての実質的な欠点を見ていません。
設計上、最上位のgitリポジトリのみを探します。つまり、「data」ディレクトリ(例ls
出力)にgitリポジトリのサブディレクトリがある場合は、以前にfind
提供したコマンドを使用して一覧表示されずに一覧表示されます。しかし、私が言ったように、これは意図的に設計されています。
これにより、出力の色は維持されませんls
。--color=always
embedコマンドにを追加するだけですls
。
paste <(ls -ld --color=always *) <(for i in *; do if [ -d "$i"/.git ] ; then echo "($(git --git-dir="$i"/.git symbolic-ref --short HEAD))"; else echo; fi; done)
ただし、何らかの理由で、すべての出力の末尾に追加の改行文字が生成されます。わかりました、そうではありません。
Mac OSではフラグls
がないので、--color
次のコマンドを使用してカラー出力を強制します。
paste <(CLICOLOR_FORCE=true ls -ld *) <(for i in *; do if [ -d "$i"/.git ] ; then echo "($(git --git-dir="$i"/.git symbolic-ref --short HEAD))"; else echo; fi; done)
答え2
次のように見えます。
find YOUR_DIR -maxdepth 1 -type d -exec echo -n "{} " \; -exec git --git-dir={}/.git symbolic-ref -q --short HEAD \;
出力例:
. fatal: Not a git repository: './.git'
./zabbix2 master
./dnsmasq fatal: Not a git repository: './dnsmasq/.git'
./puppet-network master
./resolv_conf fatal: Not a git repository: './resolv_conf/.git'
./old fatal: Not a git repository: './old/.git'
./php_ini fatal: Not a git repository: './php_ini/.git'
./stdlib fatal: Not a git repository: './stdlib/.git'
./mcollective master
./netlogon master
./debian master
./apt fatal: Not a git repository: './apt/.git'
最初の「exec」コマンドを使用して、目的のフォルダー出力形式を変更できます。
答え3
素晴らしい、
「--git-dir」オプションは私に新しいオプションであり、効果があったと言いたいと思います。今楽しい部分が出てきます。これは私のものです。十分答え、これはここの他のクエリの組み合わせです。誰もがスピードを上げる方法を知っていればいいでしょう。
alias ls='ls -FHlAt --color --show-control-chars --group-directories-first'
alias lsdif='ls | xargs --delimiter="\n" ~/.config/lsdif_colors.sh'
#################
# lsdif_colors.sh
#################
for fileLine in "$@"
do
if [[ $fileLine == total* ]]; then echo $fileLine;
else
cols=($fileLine);
cw=(-10 -1 -7 -6 -5 4 -3 2 -5 0);
for ((i=0 ; i < 9; i++))
do
printf "%${cw[i]}s " ${cols[i]}
done
name=${cols[@]:9}
if [[ -d .git ]]; then
difType=$(git diff --name-status ./$name)
if [[ ${difType:0:1} = "M" ]]; then printf "%1s \e[34m%s\e[0m\n" ${difType:0:1} "$name"
elif [[ ${difType:0:1} = "D" ]]; then printf "%1s \e[31m%s\e[0m\n" ${difType:0:1} "$name"
elif [[ ${difType:0:1} = "A" ]]; then printf "%1s \e[32m%s\e[0m\n" ${difType:0:1} "$name"
else printf " %s\n" "$name"
fi;
elif [[ $fileLine == d* ]]; then
d=$(echo ${name:0:((${#name}-1))} | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")
branch=""
if [[ -d $d/.git ]]; then
branch="("$(git --git-dir="$d"/.git symbolic-ref -q --short HEAD>&1)")"
fi;
printf " %s \e[36m%s\e[0m\n" "$name" "$branch"
else printf " %s\n" "$name"
fi;
fi;
done
これにより、1つのコマンドでディレクトリの一般的なビューを見ることができますが、少し遅いようです。 lsのような速度は期待しませんが、lsdifは不安定です。スピードを上げることができればよさそうです。そうでなければ、肩をすくめるああ、まあ。
Jaeden "Sifo Dyas" al Raec Ruinerに感謝します。