세 개의 폴더가 포함된 /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
이를 통해 하나의 명령으로 디렉토리의 일반적인 보기를 볼 수 있지만 약간 느린 것 같습니다. ls와 같은 속도는 기대하지 않지만 lsdif는 불안정합니다. 속도를 높일 수 있다면 좋을 것 같습니다. 그렇지 않다면,어깨를 으쓱하다아 글쎄.
Jaeden "Sifo Dyas" al'Raec Ruiner에게 감사드립니다.