代码之家  ›  专栏  ›  技术社区  ›  halfmoonhalf

一个项目/文件夹有两个.git目录,如何重命名工作树中的文件?

  •  0
  • halfmoonhalf  · 技术社区  · 4 年前

    出于某种原因,我跟着 https://stackoverflow.com/a/17313342/4336225 获取.gitone和.gito2。现在我需要重命名工作目录中的一个文件。传统上,我会使用

    git mv application.py newApplication.py
    

    但是我现在怎么用two.git呢?我希望他们俩都能正确地追踪到名字的变化。

    1 回复  |  直到 4 年前
        1
  •  2
  •   AlexisBRENON    4 年前

    如链接的答案所示,您应该使用 --git-dir 选项。

    git --git-dir=.gitone mv application.py newApplication.py


    编辑

    这是一个完整的演练

    
    $ # Create multiple git directories
    $ git init .
    Initialized empty Git repository in /tmp/so_git/.git/
    
    $ mv .git .gitone
    
    $ git init .
    Initialized empty Git repository in /tmp/so_git/.git/
    
    $ mv .git .gittwo
    
    $ # Add a file to both directories
    $ touch foo
    
    $ git --git-dir=.gitone add foo
    
    $ git --git-dir=.gitone commit -m "add foo"
    [master (root-commit) 0db71dc] add foo
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 foo
    
    $ git --git-dir=.gittwo add foo
    
    $ git --git-dir=.gittwo commit -m "add foo"
    [master (root-commit) 10205ba] add foo
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 foo
    
    $ # Move file in first git repo
    $ git --git-dir=.gitone mv foo bar
    
    $ git --git-dir=.gitone commit -m "foo -> bar"
    [master 20276ee] foo -> bar
     1 file changed, 0 insertions(+), 0 deletions(-)
     rename foo => bar (100%)
    
    $ # File is marked as deleted in second repo while "bar" is untracked
    $ git --git-dir=.gittwo status
    On branch master
    Changes not staged for commit:
      (use "git add/rm <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
        deleted:    foo
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        .gitone/
        .gittwo/
        bar
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    $ # Add "bar" to the tracked files
    $ git --git-dir=.gittwo add bar
    
    $ git --git-dir=.gittwo status
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
        new file:   bar
    
    Changes not staged for commit:
      (use "git add/rm <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
        deleted:    foo
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        .gitone/
        .gittwo/
    
    $ # Explicitly delete foo
    $ git --git-dir=.gittwo rm foo
    rm 'foo'
    
    $ # Now git discovered the rename
    $ git --git-dir=.gittwo status
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
        renamed:    foo -> bar
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        .gitone/
        .gittwo/
    

    如果你想使用另一种解决方案 git mv 而不是 git [add|rm] ,是为您结账 foo 文件并强制将其移动到酒吧。

    $ git --git-dir=.gitone commit -m "foo -> bar"
    [master 20276ee] foo -> bar
     1 file changed, 0 insertions(+), 0 deletions(-)
     rename foo => bar (100%)
    
    $ git --git-dir=.gittwo checkout -- foo
    
    $ git --git-dir=.gittwo mv -f foo bar
    
    $ git --git-dir=.gittwo status
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
        renamed:    foo -> bar
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        .gitone/
        .gittwo/