第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Windows中的Git符號(hào)鏈接

Windows中的Git符號(hào)鏈接

Git
瀟湘沐 2019-07-05 10:14:17
Windows中的Git符號(hào)鏈接我們的開發(fā)人員混合使用Windows和基于Unix的操作系統(tǒng),因此,在Unix機(jī)器上創(chuàng)建的符號(hào)鏈接成為Windows開發(fā)人員的一個(gè)問題。在windows(Msysgit)中,符號(hào)鏈接被轉(zhuǎn)換為文本文件,其中包含指向的文件的路徑。相反,我想將符號(hào)鏈接轉(zhuǎn)換為實(shí)際的Windows符號(hào)鏈接。[醫(yī)]更新)我必須解決的辦法是:編寫一個(gè)簽出后腳本,遞歸地查找“symlink”文本文件。將它們替換為windows符號(hào)鏈接(使用mklink),其名稱和擴(kuò)展名與虛擬“符號(hào)鏈接”相同。通過在.git/info/EXECUTE中添加條目來忽略這些windows符號(hào)鏈接我沒有落實(shí)這一點(diǎn),但我認(rèn)為這是解決這一問題的堅(jiān)實(shí)辦法。問題:如果有的話,你認(rèn)為這種方法有什么壞處?這個(gè)結(jié)帳后腳本可以實(shí)現(xiàn)嗎?也就是說,我能遞歸地找到虛擬的“符號(hào)鏈接”文件git創(chuàng)建的嗎?有沒有人寫過這樣的劇本?
查看完整描述

3 回答

?
拉丁的傳說

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊

您可以通過查找具有120000,可能使用以下命令:

git ls-files -s | awk '/120000/{print $4}'

一旦您替換了鏈接,我建議將它們標(biāo)記為git update-index --assume-unchanged,而不是將它們列在.git/info/exclude.


查看完整回答
反對(duì) 回復(fù) 2019-07-05
?
紫衣仙女

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊

我剛才問了一個(gè)完全相同的問題(一般不是在這里),最后提出了一個(gè)與OP的建議非常相似的解決方案。首先,我將直接回答問題1,2和3,然后我將張貼我最后使用的解決方案。

  1. 建議的解決方案確實(shí)有一些缺點(diǎn),主要是因?yàn)榇鎯?chǔ)庫污染的可能性增加,或者在文件處于“Windows符號(hào)鏈接”狀態(tài)時(shí)不小心添加重復(fù)文件。(下文“限制”一節(jié)將對(duì)此作更多介紹。)
  2. 是的,結(jié)帳后腳本是可實(shí)現(xiàn)的!也許不是作為一個(gè)字面上的帖子-

    git checkout

    步驟,但是下面的解決方案已經(jīng)很好地滿足了我的需求,所以不需要一個(gè)文字的簽出腳本。
  3. 是!

解決辦法:

我們的開發(fā)人員所處的情況與OP的大致相同:Windows和類Unix的主機(jī)、存儲(chǔ)庫和子模塊混合在一起,有許多git符號(hào)鏈接,并且在MsysGit的發(fā)布版本中沒有本地支持(尚未)來智能地在Windows主機(jī)上處理這些符號(hào)鏈接。

感謝josh lee指出git與特殊的filemode提交了符號(hào)鏈接。120000..有了這些信息,就可以添加一些git別名,允許在Windows主機(jī)上創(chuàng)建和操作git符號(hào)鏈接。

  1. 在Windows上創(chuàng)建Git符號(hào)鏈接

    git config --global alias.add-symlink '!'"$(cat <<'ETX'
    __git_add_symlink() {
      if [ $# -ne 2 ] || [ "$1" = "-h" ]; then
        printf '%b\n' \
            'usage: git add-symlink <source_file_or_dir> <target_symlink>\n' \
            'Create a symlink in a git repository on a Windows host.\n' \
            'Note: source MUST be a path relative to the location of target'
        [ "$1" = "-h" ] && return 0 || return 2
      fi
    
      source_file_or_dir=${1#./}
      source_file_or_dir=${source_file_or_dir%/}
    
      target_symlink=${2#./}
      target_symlink=${target_symlink%/}
      target_symlink="${GIT_PREFIX}${target_symlink}"
      target_symlink=${target_symlink%/.}
      : "${target_symlink:=.}"
    
      if [ -d "$target_symlink" ]; then
        target_symlink="${target_symlink%/}/${source_file_or_dir##*/}"
      fi
    
      case "$target_symlink" in
        (*/*) target_dir=${target_symlink%/*} ;;
        (*) target_dir=$GIT_PREFIX ;;
      esac
    
      target_dir=$(cd "$target_dir" && pwd)
    
      if [ ! -e "${target_dir}/${source_file_or_dir}" ]; then
        printf 'error: git-add-symlink: %s: No such file or directory\n' \
            "${target_dir}/${source_file_or_dir}" >&2
        printf '(Source MUST be a path relative to the location of target!)\n' >&2
        return 2
      fi
    
      git update-index --add --cacheinfo 120000 \
          "$(printf '%s' "$source_file_or_dir" | git hash-object -w --stdin)" \
          "${target_symlink}" \
        && git checkout -- "$target_symlink" \
        && printf '%s -> %s\n' "${target_symlink#$GIT_PREFIX}" "$source_file_or_dir" \
        || return $?
    }
    __git_add_symlink
    ETX
    )"

    用法:git add-symlink <source_file_or_dir> <target_symlink>,其中對(duì)應(yīng)于源文件或目錄的參數(shù)必須采用路徑的形式。相對(duì)于目標(biāo)符號(hào)鏈接。您可以按照通常使用的方式使用此別名。ln.

    例如,存儲(chǔ)庫樹:

    dir/
    dir/foo/
    dir/foo/bar/
    dir/foo/bar/baz      (file containing "I am baz")
    dir/foo/bar/lnk_file (symlink to ../../../file)
    file                 (file containing "I am file")
    lnk_bar              (symlink to dir/foo/bar/)

    可以按以下方式在Windows上創(chuàng)建:

    git init
    mkdir -p dir/foo/bar/
    echo "I am baz" > dir/foo/bar/baz
    echo "I am file" > file
    git add -A
    git commit -m "Add files"
    git add-symlink ../../../file dir/foo/bar/lnk_file
    git add-symlink dir/foo/bar/ lnk_bar
    git commit -m "Add symlinks"
  2. 用NTFS硬鏈+結(jié)取代git符號(hào)

    git config --global alias.rm-symlinks '!'"$(cat <<'ETX'
    __git_rm_symlinks() {
      case "$1" in (-h)
        printf 'usage: git rm-symlinks [symlink] [symlink] [...]\n'
        return 0
      esac
      ppid=$$
      case $# in
        (0) git ls-files -s | grep -E '^120000' | cut -f2 ;;
        (*) printf '%s\n' "$@" ;;
      esac | while IFS= read -r symlink; do
        case "$symlink" in
          (*/*) symdir=${symlink%/*} ;;
          (*) symdir=. ;;
        esac
    
        git checkout -- "$symlink"
        src="${symdir}/$(cat "$symlink")"
    
        posix_to_dos_sed='s_^/\([A-Za-z]\)_\1:_;s_/_\\\\_g'
        doslnk=$(printf '%s\n' "$symlink" | sed "$posix_to_dos_sed")
        dossrc=$(printf '%s\n' "$src" | sed "$posix_to_dos_sed")
    
        if [ -f "$src" ]; then
          rm -f "$symlink"
          cmd //C mklink //H "$doslnk" "$dossrc"
        elif [ -d "$src" ]; then
          rm -f "$symlink"
          cmd //C mklink //J "$doslnk" "$dossrc"
        else
          printf 'error: git-rm-symlink: Not a valid source\n' >&2
          printf '%s =/=> %s  (%s =/=> %s)...\n' \
              "$symlink" "$src" "$doslnk" "$dossrc" >&2
          false
        fi || printf 'ESC[%d]: %d\n' "$ppid" "$?"
    
        git update-index --assume-unchanged "$symlink"
      done | awk '
        BEGIN { status_code = 0 }
        /^ESC\['"$ppid"'\]: / { status_code = $2 ; next }
        { print }
        END { exit status_code }
      '
    }
    __git_rm_symlinks
    ETX
    )"
    
    git config --global alias.rm-symlink '!git rm-symlinks'  # for back-compat.

    用法:

    git rm-symlinks [symlink] [symlink] [...]

    這個(gè)別名可以一次地刪除git符號(hào)鏈接。Symlink將替換為NTFS硬鏈接(在文件中)或NTFS連接(在目錄中)。與“真”NTFS符號(hào)鏈接相比,使用硬鏈接+連接的好處是要?jiǎng)?chuàng)建UAC權(quán)限,不需要經(jīng)過提升的UAC權(quán)限。

    要從子模塊中刪除符號(hào)鏈接,只需使用git內(nèi)置的支持迭代它們:

    git submodule foreach --recursive git rm-symlinks

    但是,對(duì)于每一次如此激烈的行動(dòng),有一個(gè)逆轉(zhuǎn)是很好的.

  3. 在Windows上恢復(fù)Git符號(hào)鏈接

    git config --global alias.checkout-symlinks '!'"$(cat <<'ETX'
    __git_checkout_symlinks() {
      case "$1" in (-h)
        printf 'usage: git checkout-symlinks [symlink] [symlink] [...]\n'
        return 0
      esac
      case $# in
        (0) git ls-files -s | grep -E '^120000' | cut -f2 ;;
        (*) printf '%s\n' "$@" ;;
      esac | while IFS= read -r symlink; do
        git update-index --no-assume-unchanged "$symlink"
        rmdir "$symlink" >/dev/null 2>&1
        git checkout -- "$symlink"
        printf 'Restored git symlink: %s -> %s\n' "$symlink" "$(cat "$symlink")"
      done
    }
    __git_checkout_symlinks
    ETX
    )"
    
    git config --global alias.co-symlinks '!git checkout-symlinks'

    用法:git checkout-symlinks [symlink] [symlink] [...],這會(huì)使git rm-symlinks,有效地將存儲(chǔ)庫恢復(fù)到其自然狀態(tài)(除了您的更改之外,應(yīng)保持原封不動(dòng))。

    對(duì)于子模塊:

    git submodule foreach --recursive git checkout-symlinks
  4. 限制:

    • 路徑中有空格的目錄/文件/符號(hào)鏈接應(yīng)該可以工作。但是標(biāo)簽還是新行?YMMV…(我的意思是:不要那樣做,因?yàn)樗?/trans>不會(huì)工作)

    • 如果你或其他人忘了git checkout-symlinks在做一些有可能造成廣泛后果的事情之前git add -A,本地存儲(chǔ)庫可能會(huì)以污染狀態(tài)。

      使用我們以前的“示例回購(gòu)”:

      echo "I am nuthafile" > dir/foo/bar/nuthafile
      echo "Updating file" >> file
      git add -A
      git status
      # On branch master
      # Changes to be committed:
      #   (use "git reset HEAD <file>..." to unstage)
      #
      #       new file:   dir/foo/bar/nuthafile
      #       modified:   file
      #       deleted:    lnk_bar           # POLLUTION
      #       new file:   lnk_bar/baz       # POLLUTION
      #       new file:   lnk_bar/lnk_file  # POLLUTION
      #       new file:   lnk_bar/nuthafile # POLLUTION
      #

      哇哦.。

      因此,在構(gòu)建項(xiàng)目之前和之后,而不是在簽出或推送之前,將這些別名作為Windows用戶執(zhí)行的步驟是很好的。但每一種情況都是不同的。這些別名對(duì)我來說已經(jīng)足夠有用了,所以不需要真正的結(jié)帳解決方案。

希望能幫上忙!

參考資料:

http:/git-scm.com/book/en/git-inals-Git-Objects

http:/Technnet.microsoft.com/en-us/Library/cc753194


  • POSIX的遵守情況(嗯,除了那些

    mklink

    當(dāng)然)

    巴什主義!

  • 支持包含空格的目錄和文件。
  • 零和非零退出狀態(tài)代碼(分別用于通信請(qǐng)求的命令的成功/失敗)現(xiàn)在被正確保存/返回。
  • 這個(gè)

    add-symlink

    別名現(xiàn)在更像

    Ln(1)

    并且可以在存儲(chǔ)庫中的任何目錄中使用,而不僅僅是存儲(chǔ)庫的根目錄。
  • 這個(gè)

    rm-symlink

    別名(單數(shù))已被

    rm-symlinks

    別名(復(fù)數(shù)),它現(xiàn)在接受多個(gè)參數(shù)(或者根本不接受參數(shù),它像以前一樣在存儲(chǔ)庫中查找所有的符號(hào)鏈接),用于選擇性地將git符號(hào)鏈接轉(zhuǎn)換為NTFS硬鏈接+連接。
  • 這個(gè)

    checkout-symlinks

    別名還被更新為接受多個(gè)參數(shù)(或根本不接受,=All),以選擇性地逆轉(zhuǎn)上述轉(zhuǎn)換。

最后注:雖然我使用Bash3.2(甚至3.1)測(cè)試了加載和運(yùn)行這些別名的方法,對(duì)于那些由于各種原因仍然停留在這些古老版本上的人來說,請(qǐng)注意,像這些版本一樣古老的版本因其解析器錯(cuò)誤而臭名昭著。如果您在嘗試安裝這些別名時(shí)遇到了問題,首先應(yīng)該考慮的是升級(jí)shell(對(duì)于Bash,請(qǐng)使用CTRL+X、CTRL+V檢查版本)?;蛘撸绻噲D通過將它們粘貼到您的終端仿真器中來安裝它們,您可能會(huì)更幸運(yùn)地將它們粘貼到一個(gè)文件中并將其外包,例如

. ./git-win-symlinks.sh

祝好運(yùn)!


查看完整回答
反對(duì) 回復(fù) 2019-07-05
  • 3 回答
  • 0 關(guān)注
  • 919 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)