Programing

추적되지 않은 파일에 git diff를 사용할 수 있습니까?

lottogame 2020. 4. 12. 10:12
반응형

추적되지 않은 파일에 git diff를 사용할 수 있습니까?


git diff에게 diff 출력에 추적되지 않은 파일을 포함하도록 요청할 수 있습니까? 또는 내가 만든 새 파일과 내가 편집 한 기존 파일을 추가하고 사용하는 것이 가장 좋습니다.

git diff --cached

?


최신 git 버전을 사용 git add -N하면 파일 (또는 --intent-to-add)을 사용하여 길이가 0 인 얼룩을 해당 위치의 인덱스에 추가 할 수 있습니다. 결론은 "추적되지 않은"파일이 이제이 길이가 0 인 파일에 모든 내용을 추가하기위한 수정이되어 "git diff"출력에 표시된다는 것입니다.

git diff

echo "this is a new file" > new.txt
git diff

git add -N new.txt
git diff
diff --git a/new.txt b/new.txt
index e69de29..3b2aed8 100644
--- a/new.txt
+++ b/new.txt
@@ -0,0 +1 @@
+this is a new file

안타깝게도 지적한 바와 같이 보류중인 파일 git stash이있는 동안에는 할 수 없습니다 --intent-to-add. 숨겨야 할 경우 새 파일을 추가 한 다음 숨겨야합니다. 또는 에뮬레이션 해결 방법을 사용할 수 있습니다.

git update-index --add --cacheinfo \
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt

(별명 설정은 여기의 친구입니다).


두 파일의 경로를 제공하여 색인 및 추적되지 않은 파일의 파일을 비교할 수 있다고 생각합니다.

git diff --no-index tracked_file untracked_file

대화 형 일일 gitting (작업 트리를 HEAD와 항상 비교하고 diff에 포함 된 추적되지 않은 파일을 갖고 싶은 경우) add -N/--intent-to-add깨지기 때문에 사용할 수 없습니다 git stash.

여기 내 git diff교체품이 있습니다. 특히 깨끗한 솔루션은 아니지만 대화 형으로 만 사용하기 때문에 해킹으로도 괜찮습니다.

d() {
    if test "$#" = 0; then
        (
            git diff --color
            git ls-files --others --exclude-standard |
                while read -r i; do git diff --color -- /dev/null "$i"; done
        ) | `git config --get core.pager`
    else
        git diff "$@"
    fi
}

타이핑 d하면 diff에 추적되지 않은 파일이 포함되며 (워크 플로에서 신경 쓰이는 d args...것) regular과 같이 작동합니다 git diff.

노트:

  • 여기서는 실제로 git diff개별 diff가 연결 d되어 있다는 사실을 사용하므로 추적되지 않은 모든 파일이 마지막으로 정렬된다는 사실을 제외하고는 "실제 diff" 출력 을 말할 수 없습니다 .
  • 이 기능의 유일한 문제점은 경로 재 지정된 경우에도 출력이 색상 화된다는 것입니다. 그러나 나는 그것에 대한 논리를 추가하기 위해 귀찮게 할 수 없습니다.
  • 에 대한 매끄러운 인수 목록을 조합하여 추적되지 않은 파일을 얻는 방법을 찾을 수 없었습니다 git diff. 누군가이 작업을 수행하는 방법을 알아 내거나 git나중에 기능이 추가 될 예정이라면 여기에 메모를 남겨주세요!

요점까지 100 %는 아니지만 어떤 이유로 든 허용되는 대답에서 제안한대로 파일을 색인에 추가하지 않으려는 경우 다른 옵션이 있습니다.

파일이 추적되지 않으면 diff는 전체 파일이므로 분명히 적은 수로 볼 수 있습니다.

less $(git ls-files --others --exclude-standard)

와 그들 사이를 탐색 :n하고 :p다음 및 이전을위한 ..

주석에서 업데이트 : 패치 형식이 필요한 경우 다음과 결합 할 수도 있습니다 git diff.

git ls-files --others --exclude-standard | xargs -n 1 git --no-pager diff /dev/null | less

이 경우 출력을 파일로 리디렉션하거나 다른 diff 명령을 사용할 수도 있습니다.


git add -A
git diff HEAD

필요한 경우 패치를 생성 한 후 다음을 수행하십시오.

git reset HEAD

이 명령으로 스테이징 및 비 스테이징 된 경우 변경이 작동합니다. 준비되면 새 파일이 작동합니다.

$ git diff HEAD

준비되지 않은 경우 파일 차이 만 표시됩니다.


이것은 나를 위해 작동합니다 :

git add my_file.txt
git diff --cached my_file.txt
git reset my_file.txt

마지막 단계는 선택 사항이며 파일을 이전 상태로 유지합니다 (추적되지 않음)

패치를 작성하는 경우에도 유용합니다.

  git diff --cached my_file.txt > my_file-patch.patch

한 파일의 경우 :

git diff --no-index /dev/null new_file

모든 새 파일의 경우 :

for next in $( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null $next; done;

별명으로 :

alias gdnew="for next in \$( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null \$next; done;"

하나의 명령으로 결합 된 모든 수정 및 새 파일의 경우 :

{ git --no-pager diff; gdnew }

일반적으로 원격 위치 팀과 작업 할 때 git stages untrack-> staged-> commit을 수행하기 전에 bash 스크립트를 작성하기 전에 동일한 파일에서 다른 팀이 수행 한 변경 사항에 대해 사전 지식이 있어야합니다. 원격 팀과의 불필요한 병합 병합 충돌을 피하거나 새로운 로컬 지점을 만들고 주요 지점에서 비교 및 ​​병합하도록 도와줍니다.

#set -x 
branchname=`git branch | grep -F '*' |  awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | grep "modified" | awk "{print $2}" `
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file 
git difftool FETCH_HEAD $file ;
done

위의 스크립트에서 나는 원격 메인 브랜치 (마스터 브랜치가 필요하지 않음)를 FETCH_HEAD로 가져 와서 수정 된 파일의 목록 만 만들고 수정 된 파일을 git difftool과 비교합니다.

여기에 git에서 지원하는 많은 difftool이 있으며, GUI 비교를 위해 'Meld Diff Viewer'를 구성합니다.


로컬 커밋이 없다고 가정하면

git diff origin/master

참고 URL : https://stackoverflow.com/questions/855767/can-i-use-git-diff-on-untracked-files

반응형