저장소를 업데이트하고 특정 경로에 파일을 추가/제거하는 스크립트가 있습니다. 경로를 알고 나면 이러한 변경 사항을 어떻게 적용합니까? 즉,
- 지정된 파일이 작업 트리에 있으면 인덱스에 복사합니다.
- 지정된 파일이 인덱스에는 있지만 작업 트리에는 없으면 인덱스에서 제거합니다.
- 지정된 파일이 작업 트리나 인덱스에 없으면 아무 작업도 수행되지 않습니다.
git add
마지막 경우에 실패합니다. 명령줄에 경로가 없으면 오류가 발생하고 아무 작업도 수행하지 않습니다.
나는 다음을 고려했습니다.
git add --ignore-errors
, 안타깝게도 파일이 존재하지 않는 것을 무시하는 오류 유형으로 처리하지 않습니다.git add --ignore-missing
실망스럽게도 존재하지만--dry-run
.오류를 무시 하고 경로당 한 번 호출하면
git add
작동하지만 속도가 느리고 파일 존재하지 않음(인덱스나 작업 트리 모두)으로 인한 오류를 다른 오류와 구별할 수 없습니다.git add --all
특정 경로에만 파일을 스테이징하는 호출이 허용되지 않습니다 .
답변1
git add
지금까지 내가 찾은 최고의 해결책은 git 인덱스와 작업 트리를 명시적으로 확인하여 전달할 경로 목록을 구성하는 것입니다.
주어진 저장소:
git init .
echo $RANDOM > ignore-edited
echo $RANDOM > ignore-deleted
echo $RANDOM > add-edited
echo $RANDOM > add-deleted
git add .
git commit -m 'Initial commit'
echo $RANDOM > ignore-new
echo $RANDOM > ignore-edited
rm ignore-deleted
echo $RANDOM > add-new
echo $RANDOM > add-edited
rm add-deleted
업데이트할 파일 목록은 다음과 같습니다.
printf '%s\n' add-new add-edited add-deleted add-nonexistent | sort \
> /tmp/filelist.txt
추가할 파일과 인덱스의 교차점, 추가할 파일과 작업 트리의 기존 파일 사이의 합집합을 취하여 파일 목록을 구성할 수 있습니다.
comm -12 /tmp/filelist.txt <(git ls-files) \
> /tmp/files-in-index.txt
while read -r line ; do test -e "$line" && printf -- '%s\n' "$line" ; done < /tmp/filelist.txt \
> /tmp/files-in-worktree.txt
sort -um /tmp/files-in-index.txt /tmp/files-in-worktree.txt \
> /tmp/files-to-add.txt
< /tmp/files-to-add.txt xargs git add
또는 한 번의 통화로 다음을 수행합니다.
sort -um \
<(comm -12 /tmp/filelist.txt <(git ls-files)) \
<(while read -r line ; do test -e "$line" && printf -- '%s\n' "$line" ; done < /tmp/filelist.txt) |
xargs git add