ਇੱਕ ਅਣਜ਼ਿਪਡ ਫੋਲਡਰ ਨੂੰ ਇੱਕ ਗਿੱਟ ਸਬਮੋਡਿਊਲ ਦੇ ਰੂਪ ਵਿੱਚ ਜੋੜਨਾ
Git ਸਬਮੋਡਿਊਲ ਨਾਲ ਕੰਮ ਕਰਦੇ ਸਮੇਂ, ਕਈ ਵਾਰ ਅਜਿਹਾ ਹੁੰਦਾ ਹੈ ਜਦੋਂ ਰਿਪੋਜ਼ਟਰੀ ਤੋਂ ਸਿੱਧਾ ਕਲੋਨ ਕਰਨਾ ਸੰਭਵ ਨਹੀਂ ਹੁੰਦਾ। ਇਹ ਨੈੱਟਵਰਕ ਸਮੱਸਿਆਵਾਂ, ਰਿਪੋਜ਼ਟਰੀ ਪਹੁੰਚ ਪਾਬੰਦੀਆਂ, ਜਾਂ ਹੋਰ ਚੁਣੌਤੀਆਂ ਦੇ ਕਾਰਨ ਹੋ ਸਕਦਾ ਹੈ।
ਅਜਿਹੇ ਮਾਮਲਿਆਂ ਵਿੱਚ, ਤੁਸੀਂ ਜ਼ਰੂਰੀ ਫਾਈਲਾਂ ਨੂੰ ਇੱਕ ਜ਼ਿਪ ਆਰਕਾਈਵ ਵਜੋਂ ਡਾਊਨਲੋਡ ਕਰਨਾ ਖਤਮ ਕਰ ਸਕਦੇ ਹੋ। ਇਹ ਗਾਈਡ ਤੁਹਾਨੂੰ ਦਿਖਾਏਗੀ ਕਿ ਤੁਹਾਡੇ ਪ੍ਰੋਜੈਕਟ ਵਿੱਚ ਨਿਰਵਿਘਨ ਏਕੀਕਰਣ ਨੂੰ ਯਕੀਨੀ ਬਣਾਉਣ ਲਈ, ਇੱਕ Git ਸਬਮੋਡਿਊਲ ਦੇ ਰੂਪ ਵਿੱਚ ਇੱਕ ਅਨਜ਼ਿਪ ਕੀਤੇ ਫੋਲਡਰ ਨੂੰ ਕਿਵੇਂ ਜੋੜਨਾ ਹੈ।
| ਹੁਕਮ | ਵਰਣਨ |
|---|---|
| git init | ਨਿਰਧਾਰਤ ਡਾਇਰੈਕਟਰੀ ਵਿੱਚ ਇੱਕ ਨਵੀਂ Git ਰਿਪੋਜ਼ਟਰੀ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ। |
| git submodule add | ਖਾਸ ਮਾਰਗ 'ਤੇ ਮੁੱਖ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਇੱਕ ਨਵਾਂ ਸਬਮੋਡਿਊਲ ਜੋੜਦਾ ਹੈ। |
| shutil.copytree | ਇੱਕ ਪੂਰੇ ਡਾਇਰੈਕਟਰੀ ਟ੍ਰੀ ਨੂੰ ਇੱਕ ਨਵੇਂ ਟਿਕਾਣੇ 'ਤੇ ਕਾਪੀ ਕਰਦਾ ਹੈ। |
| subprocess.run | ਸਬ-ਸ਼ੈੱਲ ਵਿੱਚ ਇੱਕ ਖਾਸ ਕਮਾਂਡ ਚਲਾਉਂਦੀ ਹੈ। |
| cp -r | ਫਾਈਲਾਂ ਅਤੇ ਡਾਇਰੈਕਟਰੀਆਂ ਨੂੰ ਇੱਕ ਸਥਾਨ ਤੋਂ ਦੂਜੀ ਥਾਂ 'ਤੇ ਵਾਰ-ਵਾਰ ਕਾਪੀ ਕਰਦਾ ਹੈ। |
| os.chdir | ਮੌਜੂਦਾ ਵਰਕਿੰਗ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਨਿਰਧਾਰਤ ਮਾਰਗ ਵਿੱਚ ਬਦਲਦਾ ਹੈ। |
ਅਣਜ਼ਿਪਡ ਫੋਲਡਰ ਨੂੰ ਗਿੱਟ ਸਬਮੋਡਿਊਲ ਵਜੋਂ ਜੋੜਨ ਦਾ ਹੱਲ
ਪ੍ਰਦਾਨ ਕੀਤੀਆਂ ਸਕ੍ਰਿਪਟਾਂ ਇੱਕ ਅਣਜ਼ਿਪ ਕੀਤੇ ਫੋਲਡਰ ਨੂੰ ਇੱਕ ਗਿੱਟ ਸਬਮੋਡਿਊਲ ਵਜੋਂ ਜੋੜਨ ਦੇ ਮੁੱਦੇ ਨੂੰ ਸੰਬੋਧਿਤ ਕਰਦੀਆਂ ਹਨ। ਪਹਿਲੀ ਸਕ੍ਰਿਪਟ, ਇੱਕ Bash ਸਕ੍ਰਿਪਟ, ਸਬਮੋਡਿਊਲ ਲਈ ਇੱਕ ਡਾਇਰੈਕਟਰੀ ਬਣਾ ਕੇ ਸ਼ੁਰੂ ਹੁੰਦੀ ਹੈ mkdir ਹੁਕਮ. ਇਹ ਫਿਰ ਇਸ ਡਾਇਰੈਕਟਰੀ ਵਿੱਚ ਅਣਜ਼ਿਪ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਦੀ ਨਕਲ ਕਰਦਾ ਹੈ cp -r. ਅੱਗੇ, ਇਹ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਇੱਕ Git ਰਿਪੋਜ਼ਟਰੀ ਦੇ ਰੂਪ ਵਿੱਚ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ git init, ਸਾਰੀਆਂ ਫਾਈਲਾਂ ਨੂੰ ਜੋੜਦਾ ਹੈ, ਅਤੇ ਸ਼ੁਰੂਆਤੀ ਵਚਨਬੱਧਤਾ ਬਣਾਉਂਦਾ ਹੈ। ਸਕ੍ਰਿਪਟ ਫਿਰ ਇਸ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਮੁੱਖ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਸਬਮੋਡਿਊਲ ਵਜੋਂ ਜੋੜਦੀ ਹੈ git submodule add ਅਤੇ ਇਸ ਨੂੰ ਜੋੜਦਾ ਹੈ।
ਦੂਜੀ ਸਕ੍ਰਿਪਟ, ਪਾਈਥਨ ਵਿੱਚ ਲਿਖੀ ਗਈ, ਇੱਕ ਸਮਾਨ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਸਵੈਚਾਲਤ ਕਰਦੀ ਹੈ। ਇਹ ਅਨਜ਼ਿਪ ਕੀਤੇ ਫੋਲਡਰ, ਸਬਮੋਡਿਊਲ ਮਾਰਗ, ਅਤੇ ਮੁੱਖ ਰਿਪੋਜ਼ਟਰੀ ਲਈ ਮਾਰਗਾਂ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਕੇ ਸ਼ੁਰੂ ਹੁੰਦਾ ਹੈ। ਦ shutil.copytree ਫੰਕਸ਼ਨ ਅਨਜ਼ਿਪ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਦੀ ਨਕਲ ਕਰਦਾ ਹੈ, ਅਤੇ os.chdir ਕਮਾਂਡ ਮੌਜੂਦਾ ਵਰਕਿੰਗ ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਬਦਲਦੀ ਹੈ। ਸਕ੍ਰਿਪਟ ਵਰਤਦਾ ਹੈ subprocess.run Git ਕਮਾਂਡਾਂ ਨੂੰ ਚਲਾਉਣ ਲਈ ਜਿਵੇਂ ਕਿ git init, git add, ਅਤੇ git commit ਰਿਪੋਜ਼ਟਰੀ ਸ਼ੁਰੂ ਕਰਨ ਅਤੇ ਤਬਦੀਲੀਆਂ ਕਰਨ ਲਈ। ਇਹ ਫਿਰ ਸਬਮੋਡਿਊਲ ਨੂੰ ਮੁੱਖ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਜੋੜਦਾ ਹੈ ਅਤੇ ਤਬਦੀਲੀਆਂ ਕਰਦਾ ਹੈ, ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਕਿ ਸਬਮੋਡਿਊਲ ਸਹੀ ਤਰ੍ਹਾਂ ਨਾਲ ਏਕੀਕ੍ਰਿਤ ਹੈ।
ਇੱਕ ਅਣਜ਼ਿਪਡ ਫੋਲਡਰ ਨੂੰ ਇੱਕ ਗਿੱਟ ਸਬਮੋਡਿਊਲ ਵਜੋਂ ਜੋੜਨਾ
ਆਟੋਮੇਸ਼ਨ ਲਈ ਬੈਸ਼ ਸਕ੍ਰਿਪਟ ਦੀ ਵਰਤੋਂ ਕਰਨਾ
# Step 1: Create a new directory for the submodulemkdir pytorch-submodule# Step 2: Copy the unzipped files to the new directorycp -r /path/to/unzipped/pytorch/* pytorch-submodule/# Step 3: Initialize the directory as a Git repositorycd pytorch-submodulegit init# Step 4: Add all files and commitgit add .git commit -m "Initial commit of pytorch submodule"# Step 5: Add the submodule to the main repositorycd /path/to/your/main/repogit submodule add ./pytorch-submodule pytorch# Step 6: Commit the submodule additiongit add .gitmodules pytorchgit commit -m "Add pytorch submodule"
ਇੱਕ ਅਣਜ਼ਿਪਡ ਫੋਲਡਰ ਨੂੰ ਇੱਕ ਗਿੱਟ ਸਬਮੋਡਿਊਲ ਵਜੋਂ ਵਰਤਣਾ
ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਸਵੈਚਾਲਤ ਕਰਨ ਲਈ ਪਾਈਥਨ ਸਕ੍ਰਿਪਟ
import osimport shutilimport subprocess# Step 1: Define pathsunzipped_folder = '/path/to/unzipped/pytorch'submodule_path = '/path/to/your/main/repo/pytorch-submodule'main_repo_path = '/path/to/your/main/repo'# Step 2: Copy the unzipped foldershutil.copytree(unzipped_folder, submodule_path)# Step 3: Initialize the directory as a Git repositoryos.chdir(submodule_path)subprocess.run(['git', 'init'])# Step 4: Add all files and commitsubprocess.run(['git', 'add', '.'])subprocess.run(['git', 'commit', '-m', 'Initial commit of pytorch submodule'])# Step 5: Add the submodule to the main repositoryos.chdir(main_repo_path)subprocess.run(['git', 'submodule', 'add', './pytorch-submodule', 'pytorch'])# Step 6: Commit the submodule additionsubprocess.run(['git', 'add', '.gitmodules', 'pytorch'])subprocess.run(['git', 'commit', '-m', 'Add pytorch submodule'])
ਗਿੱਟ ਸਬਮੋਡਿਊਲ ਜੋੜਨ ਲਈ ਵਿਕਲਪਿਕ ਢੰਗ
ਜਦੋਂ ਤੁਹਾਡੇ ਕੋਲ ਇੱਕ ਡਾਊਨਲੋਡ ਕੀਤੀ ਜ਼ਿਪ ਫਾਈਲ ਹੁੰਦੀ ਹੈ ਤਾਂ ਇੱਕ ਸਬਮੋਡਿਊਲ ਨੂੰ ਜੋੜਨ ਦਾ ਇੱਕ ਹੋਰ ਤਰੀਕਾ ਹੈ ਇੱਕ ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਬਣਾਉਣਾ ਅਤੇ ਇਸਨੂੰ ਸਬਮੋਡਿਊਲ ਦੇ ਰੂਪ ਵਿੱਚ ਲਿੰਕ ਕਰਨਾ। ਇਸ ਵਿਧੀ ਵਿੱਚ ਇੱਕ ਨਵੀਂ Git ਰਿਪੋਜ਼ਟਰੀ ਨੂੰ ਬੇਅਰ ਵਜੋਂ ਸ਼ੁਰੂ ਕਰਨਾ ਸ਼ਾਮਲ ਹੈ, ਜਿਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਇਸ ਵਿੱਚ ਕੋਈ ਕੰਮ ਕਰਨ ਵਾਲੀ ਡਾਇਰੈਕਟਰੀ ਨਹੀਂ ਹੈ। ਫਿਰ ਤੁਸੀਂ ਇਸ ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਨੂੰ ਆਪਣੀ ਮੁੱਖ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਸਬਮੋਡਿਊਲ ਵਜੋਂ ਜੋੜਨ ਲਈ ਵਰਤ ਸਕਦੇ ਹੋ। ਇਸ ਵਿਧੀ ਦਾ ਫਾਇਦਾ ਇਹ ਹੈ ਕਿ ਇਹ ਤੁਹਾਨੂੰ ਮੂਲ ਰਿਪੋਜ਼ਟਰੀ ਤੋਂ ਕਲੋਨ ਕੀਤੇ ਬਿਨਾਂ ਸਬਮੋਡਿਊਲ ਦੇ ਇਤਿਹਾਸ ਅਤੇ ਮੈਟਾਡੇਟਾ ਨੂੰ ਬਣਾਈ ਰੱਖਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ।
ਇੱਕ ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਬਣਾਉਣ ਲਈ, ਦੀ ਵਰਤੋਂ ਕਰੋ git init --bare ਹੁਕਮ. ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਸੈਟ ਅਪ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਆਪਣੀਆਂ ਫਾਈਲਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰੋ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਵਚਨਬੱਧ ਕਰੋ ਜਿਵੇਂ ਤੁਸੀਂ ਇੱਕ ਮਿਆਰੀ ਗਿੱਟ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਕਰਦੇ ਹੋ। ਫਿਰ, ਇਸ ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਨੂੰ ਆਪਣੇ ਮੁੱਖ ਪ੍ਰੋਜੈਕਟ ਵਿੱਚ ਸਬਮੋਡਿਊਲ ਦੇ ਰੂਪ ਵਿੱਚ ਲਿੰਕ ਕਰੋ git submodule add ਹੁਕਮ. ਇਹ ਤਕਨੀਕ ਉਦੋਂ ਲਾਭਦਾਇਕ ਹੁੰਦੀ ਹੈ ਜਦੋਂ ਵੱਡੇ ਪ੍ਰੋਜੈਕਟਾਂ ਨਾਲ ਕੰਮ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਜਾਂ ਜਦੋਂ ਸਿੱਧੀ ਕਲੋਨਿੰਗ ਅਵਿਵਹਾਰਕ ਹੁੰਦੀ ਹੈ।
ਗਿੱਟ ਸਬਮੋਡਿਊਲ ਜੋੜਨ 'ਤੇ ਆਮ ਸਵਾਲ ਅਤੇ ਜਵਾਬ
- ਮੈਂ ਇੱਕ ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਕਿਵੇਂ ਸ਼ੁਰੂ ਕਰਾਂ?
- ਦੀ ਵਰਤੋਂ ਕਰੋ git init --bare ਇੱਕ ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਕਮਾਂਡ.
- ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਦਾ ਕੀ ਫਾਇਦਾ ਹੈ?
- ਇੱਕ ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਕੋਈ ਕੰਮ ਕਰਨ ਵਾਲੀ ਡਾਇਰੈਕਟਰੀ ਨਹੀਂ ਹੁੰਦੀ ਹੈ ਅਤੇ ਇਹ ਸ਼ੇਅਰਿੰਗ ਅਤੇ ਬੈਕਅੱਪ ਲਈ ਆਦਰਸ਼ ਹੈ।
- ਕੀ ਮੈਂ ਮੌਜੂਦਾ ਰਿਪੋਜ਼ਟਰੀ ਨੂੰ ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਬਦਲ ਸਕਦਾ ਹਾਂ?
- ਹਾਂ, ਦੀ ਵਰਤੋਂ ਕਰੋ git clone --bare ਮੌਜੂਦਾ ਰਿਪੋਜ਼ਟਰੀ ਨੂੰ ਬੇਅਰ ਵਜੋਂ ਕਲੋਨ ਕਰਨ ਲਈ ਕਮਾਂਡ.
- ਮੈਂ ਇੱਕ ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਕਿਵੇਂ ਕਰਾਂ?
- ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਇੱਕ ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਕਰੋ git commit ਉਹਨਾਂ ਨੂੰ ਸਟੇਜ ਕਰਨ ਤੋਂ ਬਾਅਦ ਕਮਾਂਡ.
- ਮੈਂ ਇੱਕ ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਨੂੰ ਸਬਮੋਡਿਊਲ ਵਜੋਂ ਕਿਵੇਂ ਲਿੰਕ ਕਰਾਂ?
- ਦੀ ਵਰਤੋਂ ਕਰੋ git submodule add ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਦੇ ਮਾਰਗ ਤੋਂ ਬਾਅਦ ਕਮਾਂਡ।
- ਕੀ ਮੈਂ ਇੱਕ ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਤੋਂ ਤਬਦੀਲੀਆਂ ਨੂੰ ਧੱਕ ਸਕਦਾ ਹਾਂ?
- ਹਾਂ, ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਤਬਦੀਲੀਆਂ ਪੁਸ਼ ਕਰੋ git push ਹੁਕਮ.
- ਕੀ ਜੇ ਮੈਨੂੰ ਸਬਮੋਡਿਊਲ ਜੋੜਨ ਵਿੱਚ ਗਲਤੀਆਂ ਦਾ ਸਾਹਮਣਾ ਕਰਨਾ ਪੈਂਦਾ ਹੈ?
- ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਮਾਰਗ ਅਤੇ ਰਿਪੋਜ਼ਟਰੀ URL ਸਹੀ ਹਨ ਅਤੇ ਰਿਪੋਜ਼ਟਰੀ ਸਹੀ ਢੰਗ ਨਾਲ ਸ਼ੁਰੂ ਕੀਤੀ ਗਈ ਹੈ।
- ਕੀ ਮੈਂ ਸਬਮੋਡਿਊਲ ਨੂੰ ਹਟਾ ਸਕਦਾ ਹਾਂ?
- ਹਾਂ, ਦੀ ਵਰਤੋਂ ਕਰੋ git submodule deinit ਅਤੇ git rm ਸਬਮੋਡਿਊਲ ਨੂੰ ਹਟਾਉਣ ਲਈ ਹੁਕਮ ਦਿੰਦਾ ਹੈ।
- ਮੈਂ ਸਬਮੋਡਿਊਲ ਨੂੰ ਕਿਵੇਂ ਅਪਡੇਟ ਕਰਾਂ?
- ਦੀ ਵਰਤੋਂ ਕਰੋ git submodule update --remote ਸਬਮੋਡਿਊਲ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਕਮਾਂਡ।
ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਸਮੇਟਣਾ
ਇੱਕ ਅਣਜ਼ਿਪ ਕੀਤੇ ਫੋਲਡਰ ਨੂੰ ਇੱਕ ਗਿੱਟ ਸਬਮੋਡਿਊਲ ਦੇ ਰੂਪ ਵਿੱਚ ਏਕੀਕ੍ਰਿਤ ਕਰਨ ਲਈ ਸਬਮੋਡਿਊਲ ਜੋੜਨ ਦੇ ਆਮ ਢੰਗ ਦੇ ਮੁਕਾਬਲੇ ਕੁਝ ਵਾਧੂ ਕਦਮਾਂ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ। ਪ੍ਰਦਾਨ ਕੀਤੀਆਂ Bash ਅਤੇ Python ਸਕ੍ਰਿਪਟਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ, ਤੁਸੀਂ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਸਵੈਚਲਿਤ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਇਹ ਯਕੀਨੀ ਬਣਾ ਸਕਦੇ ਹੋ ਕਿ ਤੁਹਾਡਾ ਸਬਮੋਡਿਊਲ ਸਹੀ ਢੰਗ ਨਾਲ ਸੈੱਟਅੱਪ ਕੀਤਾ ਗਿਆ ਹੈ। ਇਸ ਤੋਂ ਇਲਾਵਾ, ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਬਣਾਉਣ ਦੇ ਵਿਕਲਪ ਦੀ ਪੜਚੋਲ ਕਰਨਾ ਇੱਕ ਲਚਕਦਾਰ ਵਿਕਲਪ ਪੇਸ਼ ਕਰਦਾ ਹੈ। ਭਾਵੇਂ ਤੁਸੀਂ ਸਿੱਧੀ ਕਾਪੀ ਪਹੁੰਚ ਜਾਂ ਬੇਅਰ ਰਿਪੋਜ਼ਟਰੀ ਦੀ ਵਰਤੋਂ ਕਰਨਾ ਚੁਣਦੇ ਹੋ, ਇਹ ਵਿਧੀਆਂ ਡਾਉਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਨਾਲ ਨਜਿੱਠਣ ਵੇਲੇ ਸਬਮੋਡਿਊਲਾਂ ਨੂੰ ਪ੍ਰਭਾਵਸ਼ਾਲੀ ਢੰਗ ਨਾਲ ਪ੍ਰਬੰਧਿਤ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰਦੀਆਂ ਹਨ।