Git ignore .git folder

后端 未结 5 1555
梦如初夏
梦如初夏 2021-02-04 09:41

I have a php project that uses composer for package management. One of the packages is another project belonging to the same repo. I have a need to commit my entire vendor folde

相关标签:
5条回答
  • 2021-02-04 10:24

    You can use git hooks to achieve what you want. Thinking out of the box, you could use pre-commit hook to rename the .git directory of your included project, eg. to ".git2", add all files in the latter project except the ".git2" directory, commit all, push it and finally use post-commit hook to rename ".git2" folder back to ".git" in your module.

    1) Create pre-commit file under .git/hooks/ of your root repo with contents:

    #!/bin/sh
    mv "vendor/modulename/.git" "vendor/modulename/.git2"
    
    git rm --cached vendor/modulename
    git add vendor/modulename/*
    git reset vendor/modulename/.git2
    

    2) Create post-commit file under .git/hooks/ also with contents:

    #!/bin/sh
    mv "vendor/modulename/.git2" "vendor/modulename/.git"
    

    3) Change a file in your repo and finally:

    git commit -a -m "Commit msg"
    git push
    
    0 讨论(0)
  • 2021-02-04 10:27

    The entire vendor folder should be ignored, not just the .git sub-directories. Which packages are used are stored in composer.json and composer.lock which are what you check into version control.

    See: https://getcomposer.org/doc/faqs/should-i-commit-the-dependencies-in-my-vendor-directory.md

    If you want to create a reusable package as part of your project, you have two options:

    A) Use Composer to handle another repo

    Add to composer.json...

    {
        "repositories": [
            {
                "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
                "type": "git"
            }
        ],
        "require": {
            "gedmo/doctrine-extensions": "~2.3"
        }
    }
    

    B) Use a 2nd packages directory

    You can create a packages directory and add it to your autoload paths. This will let you use a single Git repo for all the code (if you want to use two repos, you can use a Git submodule)

    Add to composer.json...

    "autoload": {
        "classmap": ["packages"]
    }
    
    0 讨论(0)
  • 2021-02-04 10:27

    To not treat sub folder as a submodule, delete the .git folder. So that you won't see a folder with @number in the website. If you want to update the submodule. You can create a script like the following written in Shell

    update.sh

    git clone <url> <subfolder that you won't treat it as a module>
    rm -rf <subfolder>/.git/
    git add <subfolder>
    git commit -m "Updated module"
    

    update.bat

    git clone <url> <subfolder>
    rmdir /s /q <subfolder>\.git
    git add <subfolder>
    git commit -m "Updated module"
    

    I believe this is the best way to avoid @number in GitLab

    You can refer my GitHub repository created for answering this question.

    0 讨论(0)
  • 2021-02-04 10:30

    For me this looks like a design error:

    If you load a second project from the same repository as dependency, this project should be moved to a different repository.

    And inside the vendor Directory place another .gitignore file with

    # Ignore Git here
    .git
    
    # But not these files...
    !.gitignore
    
    0 讨论(0)
  • 2021-02-04 10:40

    It looks like git automatically ignores .git folders in subfolders of root repository.

    (master)[/tmp]  
    $ mkdir test_root
    (master)[/tmp]  
    $ git init test_root
    Initialized empty Git repository in /tmp/test_root/.git/
    (master)[/tmp]  
    $ cd test
    test/      test_root/ 
    (master)[/tmp]  
    $ cd test_root/
    (master)[/tmp/test_root]  (master) 
    $ ls
    (master)[/tmp/test_root]  (master) 
    $ git init test_child
    Initialized empty Git repository in /tmp/test_root/test_child/.git/
    (master)[/tmp/test_root]  (master) 
    $ git status
    On branch master
    
    Initial commit
    
    nothing to commit (create/copy files and use "git add" to track)
    (master)[/tmp/test_root]  (master) 
    $ touch test_root_file
    (master)[/tmp/test_root]  (master) 
    $ cd test_child/
    (master)[/tmp/test_root/test_child]  (master) 
    $ ls
    (master)[/tmp/test_root/test_child]  (master) 
    $ touch test_child_file
    (master)[/tmp/test_root/test_child]  (master) 
    $ cd ..
    (master)[/tmp/test_root]  (master) 
    $ git status
    On branch master
    
    Initial commit
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
        test_child/
        test_root_file
    
    nothing added to commit but untracked files present (use "git add" to track)
    (master)[/tmp/test_root]  (master) 
    $ git add test_child/test_child_file 
    (master)[/tmp/test_root]  (master) 
    $ git status
    On branch master
    
    Initial commit
    
    Changes to be committed:
      (use "git rm --cached <file>..." to unstage)
    
        new file:   test_child/test_child_file
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
        test_root_file
    
    (master)[/tmp/test_root]  (master) 
    $ cd test_child/
    (master)[/tmp/test_root/test_child]  (master) 
    $ git status
    On branch master
    
    Initial commit
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
        test_child_file
    
    nothing added to commit but untracked files present (use "git add" to track)
    (master)[/tmp/test_root/test_child]  (master) 
    $ git --version
    git version 1.9.1
    $ git add test_root_file 
    (master)[/tmp/test_root]  (master) 
    $ git status
    On branch master
    
    Initial commit
    
    Changes to be committed:
      (use "git rm --cached <file>..." to unstage)
    
        new file:   test_child/test_child_file
        new file:   test_root_file
    
    (master)[/tmp/test_root]  (master) 
    $ git commit -m'1 commit'
    [master (root-commit) 4d4b695] 1 commit
     2 files changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 test_child/test_child_file
     create mode 100644 test_root_file
    (master)[/tmp/test_root]  (master) 
    $ git show
    commit 4d4b69589bf4f471c3c784f95f447d2a40ee6d7d
    Author: Evgenii Shchemelev
    Date:   Wed Jan 6 09:20:03 2016 +0200
    
        1 commit
    
    diff --git a/test_child/test_child_file b/test_child/test_child_file
    new file mode 100644
    index 0000000..e69de29
    diff --git a/test_root_file b/test_root_file
    new file mode 100644
    index 0000000..e69de29
    
    0 讨论(0)
提交回复
热议问题