특정 디렉토리의 어떤 파일이 Git에서 관리되지 않는지 알고 싶습니다. 내가 이렇게 하는 이유는 백업을 위해 Git을 사용하고 궁극적으로 모든 파일을 Git에 저장하고 싶기 때문입니다.
이 작업을 수행할 수 있는 Unix 도구는 무엇입니까? find
합리적으로 효율적인 방법으로 이를 수행할 수 있는 방법이 있습니까 ?
예:
다음과 같이 RFC 관련 콘텐츠를 저장하는 폴더가 있습니다.
.
├── TheFile
└── tests
├── 4180
│ └── data
│ ├── bad
│ └── good
│ └── linebreaks.csv
├── get-rfc.sh
├── .git <contents omited>
├── LICENSE
├── README
└── rfc4180.txt
나는 나를 출력할 명령을 찾고 있습니다.
TheFile
답변1
find the_starting_dir \( -type d -exec test -d '{}'/.git \; -prune \) -o -print
가장 이식성이 뛰어난 find 호출은 아니지만 GNU find와 함께 작동합니다.
찾기는 디렉토리 트리를 탐색합니다. 이 용어는 -prune
true를 반환하지만 find
하위 트리의 추가 처리를 중지합니다. 따라서 왼쪽에는 -o
"이것이 디렉터리이고 test
하위 디렉터리가 있다고 말하면 이라고 하며 true를 반환 .git
하면 prune
트리에서 이 작업이 완료된 것입니다"라고 말합니다. 오른쪽에는 "다른 방법으로 인쇄"라고 표시되어 있습니다.
목차를 인쇄하지 않으려면 -print
으로 변경하십시오 \( ! -type d -print \)
. 그러나 목차가 비어 있다는 표시는 나타나지 않습니다.
-print
다음으로 변경 하여 목록을 얻을 수 있습니다 -ls
.-printf
매뉴얼 보기기타 등등
답변2
왜 git을 사용하지 않는지 이해가 안 돼요...
git status --untracked-files
[편집하다]
요청을 이해하는 한 디렉토리 트리가 있습니다. 이 트리에는 여러 개의 git 저장소가 있지만 전체 트리를 포괄하는 저장소는 없습니다. 이 예에서는 test 하위 디렉터리에 있는 git 저장소를 보여줍니다. 따라서 제안된 명령은 git error fatal: Not in a git 저장소가 아니라 필요에 따라 TheFile을 수신하게 됩니다.
find . -name .git -exec echo $(realpath '{}') \; |\
sed 's/\(.*\)\(.git\)/git --git-dir=\1\2 --work-tree=\1 status --untracked-files/g' | bash
답변3
귀하의 요청에는 구체적인 사례가 많이 있습니다.
- 실제로 git이 관리하는 디렉터리 외부에 위치한 파일입니다.
- 당신의
TheFile
상황에 적합합니다.
- 당신의
- 일부 태그가 포함된 Git에서 관리하는 디렉터리의 파일입니다
.git
..git
항상 디렉토리는 아닙니다. 실제 GIT_DIR에 대한 경로가 있는 파일일 수도 있습니다. 다음과 같이 이러한 파일을 추가로 분할할 수 있습니다.- 알려진 파일은 Git 인덱스에 존재하는 파일입니다.
- 무시된 파일, 다음 패턴과 일치하는 파일
gitignore(5)
:.gitignore
$HOME/.config/git/ignore
$GIT_DIR/info/exclude
$GIT_DIR
파일은 실제 디렉토리에 있지만아니요환매 계약의 일부..git/hooks
아마도- 악성코드일 수도 있습니다
따라서 가장 신뢰할 수 있는 사례는 주어진 기본 디렉터리에 대해 두 개의 목록을 생성 $D
하고 비교하는 것입니다(미리 정렬하고 중복 항목을 제거해야 합니다).
위 2.3의 하위 목록을 생성하는 신뢰할 수 있는 방법이 생각나지 않아서 공개 질문으로 남겨둡니다(이전에 감을 잃은 적이 있기 때문에 이에 대해 알고 싶습니다).
위의 2.1에 따라 알려진 파일을 나열하는 쉘 스크립트:
for g in $(find $D -name .git) ; do
echo $g
p=${g%/.git} g2=`readlink -f $g` ;
( cd $p && GIT_DIR=$g2 \
git ls-files --exclude-standard --full-name ) \
| sed "s,^,${p}/,g" ;
done > list-2.1
위의 2.2에 따라 무시된 파일을 나열하는 쉘 스크립트:
for g in $(find $D -name .git) ; do
p=${g%/.git} g2=`readlink -f $g` ;
( cd $p && GIT_DIR=$g2 \
git ls-files \
--others -i --exclude-standard ) \
| sed "s,^,${p}/,g" ;
done > list-2.2
위의 2.3에 따라 파일을 나열하는 쉘 스크립트:
TODO > list-2.3
목록을 처리하고 B면에 없는 콘텐츠를 찾는 셸 스크립트:
comm -23 <(find $D ! -type d |sort) <(sort 2.1 2.2 2.3 | uniq)
답변4
find <root_dir> -type d -name ".git"
이것이 당신이 원하는 것입니까?
당신은 또한 다음과 같은 일을 할 수 있습니다
find <root_dir> -type d -name ".git" -print0 | xargs -0 -r dirname
해당 부분 없이 디렉토리 이름만 출력합니다 . 이를 방지하고 /.git
각 폴더 이름 끝에 dirname
플러스 출력을 사용하면 됩니다.find
/../
find <root_dir> -type d -name ".git" -print0 | xargs -0 -r printf "%s/../"
편집하다
매개변수를 부정 -name
하고 -maxdepth
값을 사용할 수 있습니다. 예를 들어 c
커널 트리에서 이름이 (대문자 또는 소문자)로 시작하지 않는 모든 디렉토리를 쉽게 나열할 수 있습니다.
find linux-4.8.2/ -type d ! -iname "c*" -maxdepth 1
나는 아직도 당신이 무슨 말을 하는지 잘 이해하지 못합니다:
나는 이것의 정반대인 Git 저장소에 없는 모든 파일을 찾는 명령을 찾고 있습니다.
루트 디렉토리와 동일한 파일 시스템의 동일한 디렉토리에 있는 파일이 .git
저장소의 일부가 아닐 수도 있기 때문에 이는 문자 그대로 이름을 지정한 디렉토리와 동일한 디렉토리(또는 하위 디렉토리)에 파일이 있음을 의미합니다. .git
또한. git
개념이 있다는 것을 기억하세요.분할불일반적으로 디스크에 보이는 것은 git 저장소가 아닐 수도 있습니다.
보세요https://libgit2.github.com/이것은 많은 바인딩, 많은 문서, 예제 및 방법이 포함된 git용 공식 C 라이브러리입니다.